Compare commits

...

7 commits

Author SHA1 Message Date
TrevKnows
f5a53feb55 Updated button UI 2023-05-15 16:02:10 -04:00
TrevKnows
5df613021f Added Circuit Playground Express Pinouts
Updated the reference used for the CPX andTeensy4.1 pinout
2023-05-12 11:29:39 -04:00
TrevKnows
3f3cfd3882 Successful Removal
Added: ESP32-S2 TFT Rev, Teensy4.1, Raspberry Pi Pico, Raspberry Pi Pico W
2023-05-11 16:49:32 -04:00
TrevKnows
a148916f95 Test ARView Ready to replace BoardViewController
I will need to do a bit of thinning before TestFlight.
2023-04-18 11:53:05 -04:00
TrevKnows
6fac5e3acd Fixed placement of AR overlay
Fixed placement of AR overlay
2022-08-09 10:50:32 -04:00
TrevKnows
9ecab5dc4c Fixed Pico-W Pinout sizing 2022-07-11 22:37:20 -04:00
TrevKnows
c710222af6 Added Raspberry Pi Pico-W pinout
Also updated the pinout for Pico
2022-07-11 21:32:17 -04:00
189 changed files with 2474 additions and 9529 deletions

BIN
.DS_Store vendored

Binary file not shown.

View file

@ -7,24 +7,15 @@
objects = {
/* Begin PBXBuildFile section */
290439F02292E34200979BAD /* BoardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 290439EF2292E34200979BAD /* BoardViewController.swift */; };
2917003925858C3900E39853 /* BoardViewController+Audio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2917003825858C3900E39853 /* BoardViewController+Audio.swift */; };
293EC85925E8092C008EB6CA /* Teensy41BoardOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293EC85825E8092C008EB6CA /* Teensy41BoardOverlay.swift */; };
2948B61A25E6D82D0013781D /* CircleLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2948B61925E6D82D0013781D /* CircleLabel.swift */; };
295049AC25E6996D003E7484 /* CurvedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295049AB25E6996D003E7484 /* CurvedText.swift */; };
295049AE25E69AB0003E7484 /* BLMBoardOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 295049AD25E69AB0003E7484 /* BLMBoardOverlay.swift */; };
29546B5B2585B51000002715 /* BoardViewController+HostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29546B5A2585B51000002715 /* BoardViewController+HostingController.swift */; };
297574E025A612E4001991E7 /* SwiftUITarotCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297574DF25A612E4001991E7 /* SwiftUITarotCardView.swift */; };
29897A482569E8330080F4BF /* ARScenes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29897A472569E8330080F4BF /* ARScenes.swift */; };
29897A58256CA76F0080F4BF /* ARWorldAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29897A57256CA76F0080F4BF /* ARWorldAnchor.swift */; };
298FD3F62270B4D9007E2F4C /* QRViewController+GestureRec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298FD3F52270B4D9007E2F4C /* QRViewController+GestureRec.swift */; };
298FD3F82270B7A5007E2F4C /* QRViewController+Video.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298FD3F72270B7A5007E2F4C /* QRViewController+Video.swift */; };
29A07E9725C0CB9F006219C9 /* PICOBoardOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A07E9625C0CB9F006219C9 /* PICOBoardOverlay.swift */; };
29A83D2525EEC3F60018BEAB /* Pi400Overlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A83D2425EEC3F60018BEAB /* Pi400Overlay.swift */; };
29AA121D25A9717E0037003B /* ListOfTexts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AA121C25A9717E0037003B /* ListOfTexts.swift */; };
29B109C922933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B109C822933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift */; };
29D096292559C71D0032654B /* ClickableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D096282559C71D0032654B /* ClickableView.swift */; };
D515BADA21FF5826001E7079 /* Highlight SCNNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D515BAD921FF5826001E7079 /* Highlight SCNNode.swift */; };
D53B29AC29E440B000F68A06 /* BoardScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53B29AB29E440B000F68A06 /* BoardScanViewController.swift */; };
D53B29AE29E44FBD00F68A06 /* ARImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53B29AD29E44FBD00F68A06 /* ARImageCollectionViewCell.swift */; };
D53B29B029E4503E00F68A06 /* ARImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53B29AF29E4503E00F68A06 /* ARImageCollectionViewController.swift */; };
D54801CE217E12E700170412 /* hallowing_eye.mov in Resources */ = {isa = PBXBuildFile; fileRef = D54801CB217E118B00170412 /* hallowing_eye.mov */; };
D54E995B20E155DF0021A2E5 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54E995A20E155DF0021A2E5 /* Extensions.swift */; };
D55B075B20FF8DD40066976C /* ViewController+Gesture Recognizers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55B075A20FF8DD40066976C /* ViewController+Gesture Recognizers.swift */; };
@ -33,7 +24,6 @@
D55F683020BF2CA4005219D9 /* FocusSquare.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55F682E20BF2CA3005219D9 /* FocusSquare.swift */; };
D55F683120BF2CA4005219D9 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55F682F20BF2CA4005219D9 /* Utilities.swift */; };
D56ED486213EE255000E62F0 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56ED485213EE255000E62F0 /* MainViewController.swift */; };
D56ED488213EEC94000E62F0 /* QRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56ED487213EEC94000E62F0 /* QRViewController.swift */; };
D583C69D215BF2DB00256EB1 /* pageThree.swift in Sources */ = {isa = PBXBuildFile; fileRef = D583C69C215BF2DB00256EB1 /* pageThree.swift */; };
D58A102C20FE6C39003B0E93 /* ViewController+Nodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58A102B20FE6C39003B0E93 /* ViewController+Nodes.swift */; };
D5ABE2912146BB2A00AB8237 /* RootPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */; };
@ -59,24 +49,15 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
290439EF2292E34200979BAD /* BoardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoardViewController.swift; sourceTree = "<group>"; };
2917003825858C3900E39853 /* BoardViewController+Audio.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BoardViewController+Audio.swift"; sourceTree = "<group>"; };
293EC85825E8092C008EB6CA /* Teensy41BoardOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Teensy41BoardOverlay.swift; sourceTree = "<group>"; };
2948B61925E6D82D0013781D /* CircleLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleLabel.swift; sourceTree = "<group>"; };
295049AB25E6996D003E7484 /* CurvedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurvedText.swift; sourceTree = "<group>"; };
295049AD25E69AB0003E7484 /* BLMBoardOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BLMBoardOverlay.swift; sourceTree = "<group>"; };
29546B5A2585B51000002715 /* BoardViewController+HostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BoardViewController+HostingController.swift"; sourceTree = "<group>"; };
297574DF25A612E4001991E7 /* SwiftUITarotCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUITarotCardView.swift; sourceTree = "<group>"; };
29897A472569E8330080F4BF /* ARScenes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ARScenes.swift; sourceTree = "<group>"; };
29897A57256CA76F0080F4BF /* ARWorldAnchor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ARWorldAnchor.swift; sourceTree = "<group>"; };
298FD3F52270B4D9007E2F4C /* QRViewController+GestureRec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QRViewController+GestureRec.swift"; sourceTree = "<group>"; };
298FD3F72270B7A5007E2F4C /* QRViewController+Video.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "QRViewController+Video.swift"; sourceTree = "<group>"; };
29A07E9625C0CB9F006219C9 /* PICOBoardOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PICOBoardOverlay.swift; sourceTree = "<group>"; };
29A83D2425EEC3F60018BEAB /* Pi400Overlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pi400Overlay.swift; sourceTree = "<group>"; };
29AA121C25A9717E0037003B /* ListOfTexts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOfTexts.swift; sourceTree = "<group>"; };
29B109C822933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BoardViewController+Gesture Recognizers.swift"; sourceTree = "<group>"; };
29D096282559C71D0032654B /* ClickableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClickableView.swift; sourceTree = "<group>"; };
D515BAD921FF5826001E7079 /* Highlight SCNNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Highlight SCNNode.swift"; sourceTree = "<group>"; };
D53B29AB29E440B000F68A06 /* BoardScanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoardScanViewController.swift; sourceTree = "<group>"; };
D53B29AD29E44FBD00F68A06 /* ARImageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ARImageCollectionViewCell.swift; sourceTree = "<group>"; };
D53B29AF29E4503E00F68A06 /* ARImageCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ARImageCollectionViewController.swift; sourceTree = "<group>"; };
D54801CB217E118B00170412 /* hallowing_eye.mov */ = {isa = PBXFileReference; lastKnownFileType = video.quicktime; path = hallowing_eye.mov; sourceTree = "<group>"; };
D54E995A20E155DF0021A2E5 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
D55B075A20FF8DD40066976C /* ViewController+Gesture Recognizers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Gesture Recognizers.swift"; sourceTree = "<group>"; };
@ -85,7 +66,6 @@
D55F682E20BF2CA3005219D9 /* FocusSquare.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FocusSquare.swift; sourceTree = "<group>"; };
D55F682F20BF2CA4005219D9 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = "<group>"; };
D56ED485213EE255000E62F0 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
D56ED487213EEC94000E62F0 /* QRViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRViewController.swift; sourceTree = "<group>"; };
D583C69C215BF2DB00256EB1 /* pageThree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = pageThree.swift; sourceTree = "<group>"; };
D58A102B20FE6C39003B0E93 /* ViewController+Nodes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Nodes.swift"; sourceTree = "<group>"; };
D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootPageViewController.swift; sourceTree = "<group>"; };
@ -110,16 +90,6 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
291E63D9227C6E0E00F77AB5 /* QR Code View Controller */ = {
isa = PBXGroup;
children = (
D56ED487213EEC94000E62F0 /* QRViewController.swift */,
298FD3F52270B4D9007E2F4C /* QRViewController+GestureRec.swift */,
298FD3F72270B7A5007E2F4C /* QRViewController+Video.swift */,
);
path = "QR Code View Controller";
sourceTree = "<group>";
};
291E63DA227C8E9800F77AB5 /* Resources */ = {
isa = PBXGroup;
children = (
@ -137,30 +107,23 @@
isa = PBXGroup;
children = (
D56ED485213EE255000E62F0 /* MainViewController.swift */,
D53B29AB29E440B000F68A06 /* BoardScanViewController.swift */,
D53B29AF29E4503E00F68A06 /* ARImageCollectionViewController.swift */,
D53B29AD29E44FBD00F68A06 /* ARImageCollectionViewCell.swift */,
D583C69C215BF2DB00256EB1 /* pageThree.swift */,
D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */,
);
path = Pages;
sourceTree = "<group>";
};
29F7FDE62295B25600F15B0E /* Board Scan View Controller */ = {
29F7FDE62295B25600F15B0E /* Board Scan */ = {
isa = PBXGroup;
children = (
290439EF2292E34200979BAD /* BoardViewController.swift */,
297574DF25A612E4001991E7 /* SwiftUITarotCardView.swift */,
29A07E9625C0CB9F006219C9 /* PICOBoardOverlay.swift */,
293EC85825E8092C008EB6CA /* Teensy41BoardOverlay.swift */,
29A83D2425EEC3F60018BEAB /* Pi400Overlay.swift */,
295049AB25E6996D003E7484 /* CurvedText.swift */,
295049AD25E69AB0003E7484 /* BLMBoardOverlay.swift */,
2917003825858C3900E39853 /* BoardViewController+Audio.swift */,
2948B61925E6D82D0013781D /* CircleLabel.swift */,
29546B5A2585B51000002715 /* BoardViewController+HostingController.swift */,
29AA121C25A9717E0037003B /* ListOfTexts.swift */,
29897A472569E8330080F4BF /* ARScenes.swift */,
29B109C822933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift */,
);
path = "Board Scan View Controller";
path = "Board Scan";
sourceTree = "<group>";
};
D53C6F1C20D2D1A70051A030 /* Frameworks */ = {
@ -208,8 +171,7 @@
D55B075C20FF934B0066976C /* ViewController+Audio.swift */,
D55B075A20FF8DD40066976C /* ViewController+Gesture Recognizers.swift */,
29D096282559C71D0032654B /* ClickableView.swift */,
29F7FDE62295B25600F15B0E /* Board Scan View Controller */,
291E63D9227C6E0E00F77AB5 /* QR Code View Controller */,
29F7FDE62295B25600F15B0E /* Board Scan */,
291E63DA227C8E9800F77AB5 /* Resources */,
291E63DB227CA33700F77AB5 /* Pages */,
D5F2F4E3208E190D00B0790B /* art.scnassets */,
@ -318,7 +280,6 @@
files = (
D54E995B20E155DF0021A2E5 /* Extensions.swift in Sources */,
29AA121D25A9717E0037003B /* ListOfTexts.swift in Sources */,
297574E025A612E4001991E7 /* SwiftUITarotCardView.swift in Sources */,
D5F2F4E6208E190D00B0790B /* ViewController.swift in Sources */,
D55F683020BF2CA4005219D9 /* FocusSquare.swift in Sources */,
D5ABE2912146BB2A00AB8237 /* RootPageViewController.swift in Sources */,
@ -326,27 +287,18 @@
D55B075D20FF934B0066976C /* ViewController+Audio.swift in Sources */,
D583C69D215BF2DB00256EB1 /* pageThree.swift in Sources */,
D55B076120FF99230066976C /* WorldPosition.swift in Sources */,
298FD3F62270B4D9007E2F4C /* QRViewController+GestureRec.swift in Sources */,
29D096292559C71D0032654B /* ClickableView.swift in Sources */,
29897A58256CA76F0080F4BF /* ARWorldAnchor.swift in Sources */,
D53B29AC29E440B000F68A06 /* BoardScanViewController.swift in Sources */,
D515BADA21FF5826001E7079 /* Highlight SCNNode.swift in Sources */,
29A07E9725C0CB9F006219C9 /* PICOBoardOverlay.swift in Sources */,
29A83D2525EEC3F60018BEAB /* Pi400Overlay.swift in Sources */,
295049AC25E6996D003E7484 /* CurvedText.swift in Sources */,
2948B61A25E6D82D0013781D /* CircleLabel.swift in Sources */,
D56ED488213EEC94000E62F0 /* QRViewController.swift in Sources */,
D55B075B20FF8DD40066976C /* ViewController+Gesture Recognizers.swift in Sources */,
290439F02292E34200979BAD /* BoardViewController.swift in Sources */,
29546B5B2585B51000002715 /* BoardViewController+HostingController.swift in Sources */,
298FD3F82270B7A5007E2F4C /* QRViewController+Video.swift in Sources */,
295049AE25E69AB0003E7484 /* BLMBoardOverlay.swift in Sources */,
D53B29B029E4503E00F68A06 /* ARImageCollectionViewController.swift in Sources */,
D55F683120BF2CA4005219D9 /* Utilities.swift in Sources */,
D5F2F4E2208E190D00B0790B /* AppDelegate.swift in Sources */,
D58A102C20FE6C39003B0E93 /* ViewController+Nodes.swift in Sources */,
293EC85925E8092C008EB6CA /* Teensy41BoardOverlay.swift in Sources */,
29B109C922933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift in Sources */,
D53B29AE29E44FBD00F68A06 /* ARImageCollectionViewCell.swift in Sources */,
D56ED486213EE255000E62F0 /* MainViewController.swift in Sources */,
2917003925858C3900E39853 /* BoardViewController+Audio.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -423,7 +375,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@ -477,7 +429,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@ -490,16 +442,16 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 2X94RM7457;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Frameworks",
);
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.12;
MARKETING_VERSION = 1.14;
PRODUCT_BUNDLE_IDENTIFIER = "com.adafruit.adafruit-AR";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;
@ -512,16 +464,16 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 2X94RM7457;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Frameworks",
);
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.12;
MARKETING_VERSION = 1.14;
PRODUCT_BUNDLE_IDENTIFIER = "com.adafruit.adafruit-AR";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0;

BIN
Adafruit AR/.DS_Store vendored

Binary file not shown.

View file

@ -1,267 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="TV4-si-PBW">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="TV4-si-PBW">
<device id="ipad11_0rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--QR Mode-->
<scene sceneID="FL3-fY-ama">
<objects>
<viewController id="2cU-fx-wlI" userLabel="QR Mode" customClass="QRViewController" customModule="Adafruit_AR" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="g5D-Fh-qu3">
<rect key="frame" x="0.0" y="0.0" width="834" height="1194"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<arscnView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FWL-fP-Q4m">
<rect key="frame" x="-44" y="0.0" width="922" height="1208"/>
</arscnView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="QR Scanner" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pjb-dT-HnP">
<rect key="frame" x="16" y="51" width="161" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Heavy" family="Avenir" pointSize="19"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
<color key="shadowColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dxt-9f-ehL" userLabel="Flashlight Button">
<rect key="frame" x="778" y="144" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="torchAction:" destination="2cU-fx-wlI" eventType="touchUpInside" id="aTK-N7-y1S"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleAspectFit" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Gpe-cv-516">
<rect key="frame" x="778" y="44" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" image="HomeIcon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<segue destination="TV4-si-PBW" kind="presentation" modalTransitionStyle="flipHorizontal" id="lDk-c2-68K"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PJF-SR-1Br" userLabel="Info Button">
<rect key="frame" x="778" y="94" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" image="?mark_icon"/>
<connections>
<action selector="qrInfoIcon:" destination="2cU-fx-wlI" eventType="touchUpInside" id="I31-oc-5IE"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" alpha="0.40000000000000002" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Scan Here" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HH5-el-Qp1">
<rect key="frame" x="285" y="519" width="260" height="56"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Heavy" family="Avenir" pointSize="20"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<viewLayoutGuide key="safeArea" id="QeJ-sR-TtX"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="FWL-fP-Q4m" firstAttribute="bottom" secondItem="QeJ-sR-TtX" secondAttribute="bottom" constant="34" id="5vl-um-jaa"/>
<constraint firstItem="FWL-fP-Q4m" firstAttribute="trailing" secondItem="QeJ-sR-TtX" secondAttribute="trailing" constant="44" id="eek-V2-JgP"/>
<constraint firstItem="FWL-fP-Q4m" firstAttribute="top" secondItem="g5D-Fh-qu3" secondAttribute="top" id="tGC-DN-RTV"/>
<constraint firstItem="FWL-fP-Q4m" firstAttribute="leading" secondItem="QeJ-sR-TtX" secondAttribute="leading" constant="-44" id="u3Q-a8-1hO"/>
</constraints>
</view>
<connections>
<outlet property="homeButton" destination="Gpe-cv-516" id="vL5-p0-RPJ"/>
<outlet property="qrCodeInfoDisplay" destination="VLs-pf-QcC" id="uVa-iw-s0p"/>
<outlet property="qrInfoDisplayButton" destination="Txl-RF-5cA" id="O67-Ol-TnY"/>
<outlet property="qrSceneView" destination="FWL-fP-Q4m" id="LLI-tq-brm"/>
<outlet property="scanLabel" destination="HH5-el-Qp1" id="quU-Py-8pQ"/>
<outlet property="touchLightButton" destination="dxt-9f-ehL" id="Q48-Fu-dLK"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="J5g-Lr-jbQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
<view contentMode="scaleToFill" id="VLs-pf-QcC">
<rect key="frame" x="0.0" y="0.0" width="255" height="269"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="QR Code Mode" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TYo-m4-1ly">
<rect key="frame" x="61" y="23" width="132" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Heavy" family="Avenir" pointSize="18"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Instructions:" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="B8r-62-HkN">
<rect key="frame" x="83" y="56" width="89" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Medium" family="Avenir" pointSize="16"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Scan your Adafruit QR Code to display one of our products in AR!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3pL-1K-uII">
<rect key="frame" x="7" y="97" width="240" height="36"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Txl-RF-5cA">
<rect key="frame" x="101" y="220" width="53" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="17"/>
<state key="normal" title="Done">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="qrInfoButtonAction:" destination="2cU-fx-wlI" eventType="touchUpInside" id="RV6-8j-k0T"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Drag AR model to roate." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9hZ-rw-0XA">
<rect key="frame" x="55" y="182" width="145" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Pinch the AR model to scale it!" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6dr-y5-mrv">
<rect key="frame" x="32" y="150" width="181" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<viewLayoutGuide key="safeArea" id="5sH-DW-cqF"/>
<color key="backgroundColor" red="0.33678779006004333" green="0.66869717836380005" blue="0.90983110666275024" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</objects>
<point key="canvasLocation" x="1414" y="-2184"/>
</scene>
<!--Board Info Mode-->
<scene sceneID="nSQ-gb-evL">
<objects>
<viewController id="vvW-nO-QUQ" userLabel="Board Info Mode" customClass="BoardViewController" customModule="Adafruit_AR" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="cTq-J8-T1c">
<rect key="frame" x="0.0" y="0.0" width="834" height="1194"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<arscnView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UH8-jw-YWj">
<rect key="frame" x="-7" y="-5" width="849" height="1203"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</arscnView>
<button opaque="NO" contentMode="scaleAspectFit" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VS0-h9-CUy" userLabel="Home Button">
<rect key="frame" x="778" y="44" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" image="HomeIcon">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="homeButtonAction:" destination="vvW-nO-QUQ" eventType="touchUpInside" id="zJw-T5-IjF"/>
<segue destination="TV4-si-PBW" kind="presentation" modalPresentationStyle="fullScreen" modalTransitionStyle="crossDissolve" id="u7e-oD-Y3K"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Scan Here" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zl7-iH-s6c">
<rect key="frame" x="373" y="551" width="90" height="26"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Heavy" family="Avenir" pointSize="19"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.51961151541095896" colorSpace="custom" customColorSpace="displayP3"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="M1b-X6-ClA" userLabel="Info Button">
<rect key="frame" x="778" y="94" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" image="?mark_icon"/>
<connections>
<action selector="boardInfoAction:" destination="vvW-nO-QUQ" eventType="touchUpInside" id="xvV-c2-2p3"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Board Scanner" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="soT-Be-nk8">
<rect key="frame" x="19" y="37" width="158" height="45"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Heavy" family="Avenir" pointSize="19"/>
<color key="textColor" name="alternateSelectedControlTextColor" catalog="System" colorSpace="catalog"/>
<nil key="highlightedColor"/>
</label>
<visualEffectView opaque="NO" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hrs-8n-nRU">
<rect key="frame" x="-7" y="0.0" width="849" height="1198"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="Yk8-9c-YvN">
<rect key="frame" x="0.0" y="0.0" width="849" height="1198"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<blurEffect style="light"/>
</visualEffectView>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RYM-3l-bpr">
<rect key="frame" x="281" y="259" width="292" height="382"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" lineBreakMode="tailTruncation" numberOfLines="7" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bi5-NN-nXJ">
<rect key="frame" x="31" y="50" width="240" height="154"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<string key="text">Scan your Adafruit board to display component info in AR!
Works with:
• Circuit Playground Express
• PyPortal
+ more to come</string>
<fontDescription key="fontDescription" name="AvenirNext-Bold" family="Avenir Next" pointSize="15"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Board Scanner Mode" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="55N-T1-Xey">
<rect key="frame" x="31" y="8" width="240" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Avenir-Heavy" family="Avenir" pointSize="20"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" lineBreakMode="tailTruncation" numberOfLines="4" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="j7N-r2-7EC">
<rect key="frame" x="25" y="212" width="246" height="96"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<string key="text">Scan your Raspberry Pi Pico, Raspberry Pi 400, and Teensy 4.1 to display an overlay of its Pinouts and Power Pins!(Only Available for iOS 14+)</string>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="24"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="P2B-8a-P4h">
<rect key="frame" x="123" y="325" width="46" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="18"/>
<state key="normal" title="Done">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="dismissBoardIconPopup:" destination="vvW-nO-QUQ" eventType="touchUpInside" id="EI8-IR-QZZ"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.33678779009999998" green="0.66869717839999998" blue="0.9098311067" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<viewLayoutGuide key="safeArea" id="8eE-ts-kY1"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
<navigationItem key="navigationItem" id="VSu-oy-E0D"/>
<connections>
<outlet property="boardInfoButton" destination="M1b-X6-ClA" id="c6w-Z2-UH6"/>
<outlet property="boardItemView" destination="RYM-3l-bpr" id="nYB-tU-rAW"/>
<outlet property="boardSceneView" destination="UH8-jw-YWj" id="VNq-YM-bid"/>
<outlet property="homeButton" destination="VS0-h9-CUy" id="qd4-BW-beA"/>
<outlet property="scanLabel" destination="Zl7-iH-s6c" id="lWH-do-Abr"/>
<outlet property="visualBoardEffectView" destination="Hrs-8n-nRU" id="afV-qX-qkQ"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="kqJ-3F-tXc" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1414" y="-363"/>
</scene>
<!--Onboarding p1-->
<scene sceneID="sWd-JV-Aqa">
<objects>
@ -279,7 +24,7 @@ Works with:
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Adabot-Mode-icon-512px" translatesAutoresizingMaskIntoConstraints="NO" id="3Pr-7B-Svr">
<rect key="frame" x="62" y="365" width="705" height="463"/>
<rect key="frame" x="59" y="362" width="704" height="463"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Welcome to" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oIv-ru-hfz">
@ -290,8 +35,8 @@ Works with:
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="never" editable="NO" text="Adafruit AR has three modes …" textAlignment="center" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pDm-P7-xWw">
<rect key="frame" x="36" y="925" width="760" height="68"/>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="never" editable="NO" text="Adafruit AR has two modes …" textAlignment="center" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pDm-P7-xWw">
<rect key="frame" x="32" y="923" width="761" height="69"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@ -316,7 +61,7 @@ Works with:
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="test1" translatesAutoresizingMaskIntoConstraints="NO" id="5i7-wJ-8X2" userLabel="Adabot">
<rect key="frame" x="80" y="231" width="667" height="441"/>
<rect key="frame" x="79" y="228" width="667" height="441"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="adabot" translatesAutoresizingMaskIntoConstraints="NO" id="fSX-bs-tx0">
@ -324,7 +69,7 @@ Works with:
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</imageView>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="never" editable="NO" textAlignment="center" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s4z-Yk-nql">
<rect key="frame" x="36" y="665" width="760" height="447"/>
<rect key="frame" x="35" y="663" width="759" height="447"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<string key="text">Meet Adabot, your personal robot assistant!
@ -394,12 +139,12 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<rect key="frame" x="37" y="180" width="300" height="300"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="cpx1" translatesAutoresizingMaskIntoConstraints="NO" id="e4O-gF-k4I" userLabel="Adabot">
<rect key="frame" x="80" y="256" width="667" height="441"/>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Circuit Playground Bluefruit" translatesAutoresizingMaskIntoConstraints="NO" id="e4O-gF-k4I" userLabel="Adabot">
<rect key="frame" x="76" y="253" width="667" height="442"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="never" editable="NO" textAlignment="center" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iGf-jB-gh2">
<rect key="frame" x="36" y="728" width="760" height="225"/>
<rect key="frame" x="32" y="727" width="762" height="224"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<string key="text">In Board Info mode, view your own real Adafruit board with an AR overlay describing important details - chips, components, &amp; more! </string>
@ -430,7 +175,7 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleAspectFit" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hxB-7h-VYD">
<rect key="frame" x="227" y="1031" width="378" height="62"/>
<rect key="frame" x="224" y="1029" width="377" height="62"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
@ -448,7 +193,7 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
</connections>
</button>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" editable="NO" textAlignment="center" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xbb-c5-i7W">
<rect key="frame" x="36" y="725" width="760" height="275"/>
<rect key="frame" x="34" y="724" width="759" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<string key="text">While in QR mode, scan the Adafruit QR code on your invoice to display 3D product models, descriptions, videos, and links to helpful tutorials.</string>
@ -457,7 +202,7 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
<imageView opaque="NO" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="QR-Mode-icon-512px" translatesAutoresizingMaskIntoConstraints="NO" id="n19-Bk-a29">
<rect key="frame" x="105" y="246" width="620" height="411"/>
<rect key="frame" x="102" y="245" width="619" height="410"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="QR Codes" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kdp-xp-SKl">
@ -506,16 +251,6 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<rect key="frame" x="0.0" y="0.0" width="834" height="1194"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="i4v-di-Acz">
<rect key="frame" x="317.5" y="111" width="199" height="199"/>
<constraints>
<constraint firstAttribute="width" secondItem="i4v-di-Acz" secondAttribute="height" multiplier="1:1" id="GOQ-tj-cVV"/>
</constraints>
<state key="normal" image="Adabot-Mode-icon-512px"/>
<connections>
<segue destination="BV1-FR-VrT" kind="presentation" identifier="" modalPresentationStyle="fullScreen" modalTransitionStyle="flipHorizontal" id="XGC-UV-bv7"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Version" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xf5-5J-Hvr" userLabel="Version Label">
<rect key="frame" x="379.5" y="52" width="75" height="20"/>
<constraints>
@ -536,89 +271,61 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Board Scanner" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="69X-ph-JvD" userLabel="Board Label">
<rect key="frame" x="327" y="585.5" width="180" height="28"/>
<constraints>
<constraint firstAttribute="width" constant="180" id="YDO-Dj-dEZ"/>
</constraints>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="20"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Meet Adabot" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GPs-fe-Oq7" userLabel="Adabot Label">
<rect key="frame" x="327" y="318" width="180" height="28"/>
<constraints>
<constraint firstAttribute="width" constant="180" id="vbi-ic-tFI"/>
</constraints>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="20"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="71S-tN-o8i" userLabel="Board Icon">
<rect key="frame" x="317.5" y="378.5" width="199" height="199"/>
<constraints>
<constraint firstAttribute="width" secondItem="71S-tN-o8i" secondAttribute="height" multiplier="1:1" id="Rge-Dd-gQ4"/>
</constraints>
<state key="normal" title="Button" image="Circuit_Playground1-mask2"/>
<connections>
<segue destination="vvW-nO-QUQ" kind="presentation" identifier="" modalPresentationStyle="fullScreen" modalTransitionStyle="crossDissolve" id="Ekl-WB-CCK"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Scan QR Code" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JoM-op-FvU" userLabel="QR Label">
<rect key="frame" x="327" y="853.5" width="180" height="27.5"/>
<constraints>
<constraint firstAttribute="width" constant="180" id="Lkf-ET-bM9"/>
</constraints>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="20"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NU1-NZ-3YS" userLabel="QR Icon">
<rect key="frame" x="317.5" y="646.5" width="199" height="199"/>
<constraints>
<constraint firstAttribute="width" secondItem="NU1-NZ-3YS" secondAttribute="height" multiplier="1:1" id="0uH-dD-LiF"/>
</constraints>
<state key="normal" title="Button" image="QR-Mode-icon-512px"/>
<connections>
<segue destination="2cU-fx-wlI" kind="presentation" modalPresentationStyle="fullScreen" modalTransitionStyle="flipHorizontal" id="nhd-am-G0o"/>
</connections>
</button>
<arscnView hidden="YES" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="n9p-8U-ZtN">
<rect key="frame" x="0.0" y="1046" width="1" height="1"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</arscnView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="rzH-3l-atp">
<rect key="frame" x="304.5" y="100" width="225" height="550"/>
<subviews>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="i4v-di-Acz">
<rect key="frame" x="0.0" y="0.0" width="225" height="225"/>
<constraints>
<constraint firstAttribute="height" constant="225" id="pNO-qL-tXF"/>
<constraint firstAttribute="width" constant="225" id="wCF-1t-H4X"/>
</constraints>
<state key="normal" image="Adabot-Mode-icon-512px"/>
<connections>
<segue destination="BV1-FR-VrT" kind="presentation" modalPresentationStyle="fullScreen" id="nts-Q6-BCz"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Meet Adabot" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GPs-fe-Oq7" userLabel="Adabot Label">
<rect key="frame" x="0.0" y="240" width="225" height="27.5"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="20"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="71S-tN-o8i" userLabel="Board Icon">
<rect key="frame" x="0.0" y="282.5" width="225" height="225"/>
<constraints>
<constraint firstAttribute="height" constant="225" id="Uwb-gh-0Ie"/>
<constraint firstAttribute="width" constant="225" id="iAu-WF-5DK"/>
</constraints>
<state key="normal" image="Circuit_Playground1-mask2"/>
<connections>
<action selector="boardScanButtonPress:" destination="TV4-si-PBW" eventType="touchUpInside" id="nAb-l9-NKy"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="Board Scanner" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="69X-ph-JvD" userLabel="Board Label">
<rect key="frame" x="0.0" y="522.5" width="225" height="27.5"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="20"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
<viewLayoutGuide key="safeArea" id="AW5-us-1F3"/>
<color key="backgroundColor" red="0.15781691670417786" green="0.67801815271377563" blue="0.93185180425643921" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="71S-tN-o8i" firstAttribute="height" secondItem="3Za-QD-T4W" secondAttribute="height" multiplier="1:6" id="0DG-FU-ADz"/>
<constraint firstItem="JoM-op-FvU" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="1sR-BO-ACN"/>
<constraint firstItem="NU1-NZ-3YS" firstAttribute="height" secondItem="3Za-QD-T4W" secondAttribute="height" multiplier="1:6" id="482-5d-a7R"/>
<constraint firstItem="i4v-di-Acz" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="7aN-av-zeJ"/>
<constraint firstItem="GPs-fe-Oq7" firstAttribute="top" secondItem="i4v-di-Acz" secondAttribute="bottom" constant="8" id="DlR-iY-hb6"/>
<constraint firstItem="GPs-fe-Oq7" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="Dlf-qm-xTg"/>
<constraint firstItem="i4v-di-Acz" firstAttribute="height" secondItem="3Za-QD-T4W" secondAttribute="height" multiplier="1:6" id="Eyw-lY-kPh"/>
<constraint firstItem="Xf5-5J-Hvr" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="FTP-8B-wRs"/>
<constraint firstItem="rzH-3l-atp" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="JPe-0j-lDY"/>
<constraint firstItem="hrz-cZ-enL" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="KJp-Wc-5jQ"/>
<constraint firstItem="71S-tN-o8i" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="PKS-Am-Qpf"/>
<constraint firstItem="hrz-cZ-enL" firstAttribute="top" secondItem="AW5-us-1F3" secondAttribute="top" constant="2" id="Xol-1g-MK3"/>
<constraint firstItem="69X-ph-JvD" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="ZLE-kE-o4R"/>
<constraint firstItem="NU1-NZ-3YS" firstAttribute="top" secondItem="69X-ph-JvD" secondAttribute="bottom" constant="32.670000000000002" id="bVC-Fr-Ncx"/>
<constraint firstItem="Xf5-5J-Hvr" firstAttribute="top" secondItem="hrz-cZ-enL" secondAttribute="bottom" id="h4u-CL-BuE"/>
<constraint firstItem="NU1-NZ-3YS" firstAttribute="centerX" secondItem="3Za-QD-T4W" secondAttribute="centerX" id="hjr-20-NQQ"/>
<constraint firstItem="71S-tN-o8i" firstAttribute="top" secondItem="GPs-fe-Oq7" secondAttribute="bottom" constant="32.670000000000002" id="nRR-Zn-byS"/>
<constraint firstItem="i4v-di-Acz" firstAttribute="top" secondItem="Xf5-5J-Hvr" secondAttribute="bottom" constant="39" id="nzO-Ka-SOZ"/>
<constraint firstItem="JoM-op-FvU" firstAttribute="top" secondItem="NU1-NZ-3YS" secondAttribute="bottom" constant="8" id="r3Y-xA-JwT"/>
<constraint firstItem="69X-ph-JvD" firstAttribute="top" secondItem="71S-tN-o8i" secondAttribute="bottom" constant="8" id="xxi-vL-Mg6"/>
<constraint firstItem="rzH-3l-atp" firstAttribute="top" secondItem="Xf5-5J-Hvr" secondAttribute="bottom" constant="28" id="y7g-1g-yzk"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="BHS-Qm-M7o"/>
<connections>
<outlet property="ARLabel" destination="GPs-fe-Oq7" id="0uu-JS-jI1"/>
<outlet property="arModeAdabot" destination="i4v-di-Acz" id="imG-wo-zZB"/>
<outlet property="boardView" destination="n9p-8U-ZtN" id="Es2-lW-ANW"/>
<outlet property="qrLabel" destination="JoM-op-FvU" id="qq2-gj-fB0"/>
<outlet property="qrModeIcon" destination="NU1-NZ-3YS" id="2Bc-I2-dkp"/>
<outlet property="boardScanButton" destination="71S-tN-o8i" id="hzb-rF-lPa"/>
<outlet property="versionNumberLabel" destination="Xf5-5J-Hvr" id="YkT-bR-DRp"/>
</connections>
</viewController>
@ -629,12 +336,119 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<!--Adabot Mode-->
<scene sceneID="tXr-a1-R10">
<objects>
<viewController id="BV1-FR-VrT" userLabel="Adabot Mode" customClass="ViewController" customModule="Adafruit_AR" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="KUk-eV-fls">
<rect key="frame" x="0.0" y="0.0" width="834" height="1194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<arscnView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MgE-aG-4qB">
<rect key="frame" x="-4" y="-3" width="838" height="1197"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</arscnView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="MOVE AROUND TO SCAN A SURFACE" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cBD-LG-gQT">
<rect key="frame" x="7" y="129" width="822" height="26"/>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
<color key="shadowColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<size key="shadowOffset" width="1" height="1"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uLI-mV-Wox">
<rect key="frame" x="736" y="1095" width="64" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<connections>
<action selector="toggleAction:" destination="BV1-FR-VrT" eventType="touchUpInside" id="x1v-Ne-U66"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="w89-iZ-RSu">
<rect key="frame" x="394" y="1108" width="45" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" name="AvenirNext-Regular" family="Avenir Next" pointSize="15"/>
<state key="normal">
<color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="recordToggle:" destination="BV1-FR-VrT" eventType="touchUpInside" id="t2f-nu-cGL"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="n5S-6N-62f">
<rect key="frame" x="31" y="1095" width="66" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" red="0.0" green="0.4488220363" blue="1" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<state key="normal" backgroundImage="button:n5S-6N-62f:backgroundImage"/>
<connections>
<action selector="alphButton:" destination="BV1-FR-VrT" eventType="touchUpInside" id="7F2-Un-A6y"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fZt-j6-9yz">
<rect key="frame" x="20" y="20" width="40" height="40"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="QNg-CK-fNz"/>
<constraint firstAttribute="height" constant="40" id="qKu-5B-e9t"/>
</constraints>
<state key="normal" title="Home" image="HomeIcon"/>
<connections>
<segue destination="TV4-si-PBW" kind="presentation" id="bML-TM-6Ec"/>
</connections>
</button>
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5y3-JG-2nO">
<rect key="frame" x="-44" y="0.0" width="922" height="1194"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="vNn-B3-qK9">
<rect key="frame" x="0.0" y="0.0" width="922" height="1194"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<blurEffect style="light"/>
</visualEffectView>
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="498-ob-xo5">
<rect key="frame" x="774" y="20" width="40" height="40"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="W0t-dB-szC"/>
<constraint firstAttribute="height" constant="40" id="xQF-9b-0Qn"/>
</constraints>
<state key="normal" title="Info" image="?mark_icon"/>
<connections>
<action selector="infoAction:" destination="BV1-FR-VrT" eventType="touchUpInside" id="OIm-1j-JoR"/>
</connections>
</button>
</subviews>
<viewLayoutGuide key="safeArea" id="B6J-0k-EaY"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="5y3-JG-2nO" secondAttribute="bottom" id="4JL-oC-YeK"/>
<constraint firstItem="cBD-LG-gQT" firstAttribute="top" secondItem="B6J-0k-EaY" secondAttribute="top" constant="129" id="4MJ-2d-iDB"/>
<constraint firstItem="5y3-JG-2nO" firstAttribute="trailing" secondItem="B6J-0k-EaY" secondAttribute="trailing" constant="44" id="7h3-T8-gvp"/>
<constraint firstItem="5y3-JG-2nO" firstAttribute="leading" secondItem="B6J-0k-EaY" secondAttribute="leading" constant="-44" id="Mp4-wN-sqU"/>
<constraint firstItem="fZt-j6-9yz" firstAttribute="top" secondItem="B6J-0k-EaY" secondAttribute="top" constant="20" id="RwH-Nz-Z0A"/>
<constraint firstItem="fZt-j6-9yz" firstAttribute="leading" secondItem="B6J-0k-EaY" secondAttribute="leading" constant="20" id="Y0c-nt-RCp"/>
<constraint firstItem="498-ob-xo5" firstAttribute="top" secondItem="B6J-0k-EaY" secondAttribute="top" constant="20" id="gTv-vS-ErF"/>
<constraint firstItem="5y3-JG-2nO" firstAttribute="top" secondItem="KUk-eV-fls" secondAttribute="top" id="gnf-nn-GdG"/>
<constraint firstItem="cBD-LG-gQT" firstAttribute="leading" secondItem="KUk-eV-fls" secondAttribute="leading" constant="7" id="hTZ-H3-Uwo"/>
<constraint firstAttribute="trailing" secondItem="cBD-LG-gQT" secondAttribute="trailing" constant="5" id="oop-zx-lgu"/>
<constraint firstItem="B6J-0k-EaY" firstAttribute="trailing" secondItem="498-ob-xo5" secondAttribute="trailing" constant="20" id="uCW-W9-klt"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="x2A-hc-xQe"/>
<connections>
<outlet property="addedBlurEffect" destination="5y3-JG-2nO" id="dSK-7Y-dsB"/>
<outlet property="alphButton" destination="n5S-6N-62f" id="h63-YI-oYV"/>
<outlet property="homeButton" destination="fZt-j6-9yz" id="odf-YG-874"/>
<outlet property="infoButton" destination="498-ob-xo5" id="oTA-Y7-bL2"/>
<outlet property="itemView" destination="rfW-ZP-ZId" id="egF-w6-xxI"/>
<outlet property="placementLabel" destination="cBD-LG-gQT" id="d57-9B-WQ5"/>
<outlet property="recordButton" destination="w89-iZ-RSu" id="Bnl-tl-dIa"/>
<outlet property="sceneView" destination="MgE-aG-4qB" id="6p4-IP-UeM"/>
<outlet property="toggleButton" destination="uLI-mV-Wox" id="Le6-fX-Dj0"/>
<outlet property="videoInfoView" destination="hfW-c6-dhX" id="I8N-Et-0Ag"/>
</connections>
</viewController>
<view contentMode="scaleToFill" id="rfW-ZP-ZId">
<rect key="frame" x="0.0" y="0.0" width="689" height="391"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x0S-5Z-H4u">
<rect key="frame" x="324" y="338" width="42" height="33"/>
<rect key="frame" x="324" y="318" width="42" height="33"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
<state key="normal" title="Done">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -698,25 +512,25 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="TAP A LETTER TO PLAY A CIRCRUIT PLAYGROUND VIDEO" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qF6-4V-xFK">
<rect key="frame" x="13" y="23" width="228" height="30.5"/>
<rect key="frame" x="13" y="47" width="228" height="30.5"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="11"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="TAP THE VIDEO TO STOP " textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kPn-8Y-U3u">
<rect key="frame" x="13" y="80" width="228" height="16.5"/>
<rect key="frame" x="13" y="104" width="228" height="16.5"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="12"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PRESS AND HOLD EITHER THE VIDEO OR ADABOT TO EXIT A VIDEO" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rbN-i4-Sa7">
<rect key="frame" x="13" y="117" width="229" height="33"/>
<rect key="frame" x="13" y="141" width="229" height="33"/>
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="12"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0JT-x0-hGz">
<rect key="frame" x="79" y="222" width="96" height="40"/>
<rect key="frame" x="79" y="202" width="96" height="40"/>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="20"/>
<state key="normal" title="Done">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -749,112 +563,17 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
</userDefinedRuntimeAttributes>
</view>
<placeholder placeholderIdentifier="IBFirstResponder" id="SZV-WD-TEh" sceneMemberID="firstResponder"/>
<viewController id="BV1-FR-VrT" userLabel="Adabot Mode" customClass="ViewController" customModule="Adafruit_AR" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="KUk-eV-fls">
<rect key="frame" x="0.0" y="0.0" width="834" height="1194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<arscnView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MgE-aG-4qB">
<rect key="frame" x="0.0" y="0.0" width="834" height="1193"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</arscnView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="MOVE AROUND TO SCAN A SURFACE" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cBD-LG-gQT">
<rect key="frame" x="7" y="129" width="822" height="26"/>
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
<color key="shadowColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<size key="shadowOffset" width="1" height="1"/>
</label>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uLI-mV-Wox">
<rect key="frame" x="737" y="1098" width="66" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<connections>
<action selector="toggleAction:" destination="BV1-FR-VrT" eventType="touchUpInside" id="x1v-Ne-U66"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="w89-iZ-RSu">
<rect key="frame" x="396" y="1109" width="44" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" name="AvenirNext-Regular" family="Avenir Next" pointSize="15"/>
<state key="normal">
<color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="recordToggle:" destination="BV1-FR-VrT" eventType="touchUpInside" id="t2f-nu-cGL"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="n5S-6N-62f">
<rect key="frame" x="31" y="1098" width="66" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" red="0.0" green="0.4488220363" blue="1" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<state key="normal" backgroundImage="button:n5S-6N-62f:backgroundImage"/>
<connections>
<action selector="alphButton:" destination="BV1-FR-VrT" eventType="touchUpInside" id="7F2-Un-A6y"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleAspectFit" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="498-ob-xo5">
<rect key="frame" x="778" y="94" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Info" image="?mark_icon"/>
<connections>
<action selector="infoAction:" destination="BV1-FR-VrT" eventType="touchUpInside" id="OIm-1j-JoR"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleAspectFit" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fZt-j6-9yz">
<rect key="frame" x="778" y="44" width="35" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Home" image="HomeIcon"/>
<connections>
<segue destination="TV4-si-PBW" kind="presentation" modalTransitionStyle="flipHorizontal" id="A8j-vO-tW6"/>
</connections>
</button>
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5y3-JG-2nO">
<rect key="frame" x="-44" y="0.0" width="922" height="1194"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="vNn-B3-qK9">
<rect key="frame" x="0.0" y="0.0" width="922" height="1194"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<blurEffect style="light"/>
</visualEffectView>
</subviews>
<viewLayoutGuide key="safeArea" id="B6J-0k-EaY"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="5y3-JG-2nO" secondAttribute="bottom" id="4JL-oC-YeK"/>
<constraint firstItem="cBD-LG-gQT" firstAttribute="top" secondItem="B6J-0k-EaY" secondAttribute="top" constant="129" id="4MJ-2d-iDB"/>
<constraint firstItem="5y3-JG-2nO" firstAttribute="trailing" secondItem="B6J-0k-EaY" secondAttribute="trailing" constant="44" id="7h3-T8-gvp"/>
<constraint firstItem="5y3-JG-2nO" firstAttribute="leading" secondItem="B6J-0k-EaY" secondAttribute="leading" constant="-44" id="Mp4-wN-sqU"/>
<constraint firstItem="5y3-JG-2nO" firstAttribute="top" secondItem="KUk-eV-fls" secondAttribute="top" id="gnf-nn-GdG"/>
<constraint firstItem="cBD-LG-gQT" firstAttribute="leading" secondItem="KUk-eV-fls" secondAttribute="leading" constant="7" id="hTZ-H3-Uwo"/>
<constraint firstAttribute="trailing" secondItem="cBD-LG-gQT" secondAttribute="trailing" constant="5" id="oop-zx-lgu"/>
</constraints>
</view>
<connections>
<outlet property="addedBlurEffect" destination="5y3-JG-2nO" id="dSK-7Y-dsB"/>
<outlet property="alphButton" destination="n5S-6N-62f" id="h63-YI-oYV"/>
<outlet property="homeButton" destination="fZt-j6-9yz" id="odf-YG-874"/>
<outlet property="infoButton" destination="498-ob-xo5" id="oTA-Y7-bL2"/>
<outlet property="itemView" destination="rfW-ZP-ZId" id="egF-w6-xxI"/>
<outlet property="placementLabel" destination="cBD-LG-gQT" id="d57-9B-WQ5"/>
<outlet property="recordButton" destination="w89-iZ-RSu" id="Bnl-tl-dIa"/>
<outlet property="sceneView" destination="MgE-aG-4qB" id="6p4-IP-UeM"/>
<outlet property="toggleButton" destination="uLI-mV-Wox" id="Le6-fX-Dj0"/>
<outlet property="videoInfoView" destination="hfW-c6-dhX" id="I8N-Et-0Ag"/>
</connections>
</viewController>
</objects>
<point key="canvasLocation" x="2168.8000000000002" y="-2183.497536945813"/>
<point key="canvasLocation" x="2241.7266187050363" y="-1304.0201005025126"/>
</scene>
</scenes>
<inferredMetricsTieBreakers>
<segue reference="lDk-c2-68K"/>
<segue reference="dpc-io-64V"/>
</inferredMetricsTieBreakers>
<resources>
<image name="?mark_icon" width="64" height="64"/>
<image name="Adabot-Mode-icon-512px" width="512" height="512"/>
<image name="Circuit Playground Bluefruit" width="595" height="607"/>
<image name="Circuit_Playground1-mask2" width="512" height="512"/>
<image name="HomeIcon" width="512" height="512"/>
<image name="QR-Mode-icon-512px" width="512" height="512"/>
@ -2620,7 +2339,6 @@ AAGH/wABiAQAAYgKAAGIEgABiBQAAYgWAAGIGAABiBoAAZm6AAGZvwABmcwAAZnPAAGZ3AABmeEAAZnp
AAGZ7AABmfEAAZn5AAAAAAAABAEAAAAAAAAAaAAAAAAAAAAAAAAAAAABmfw
</mutableData>
</image>
<image name="cpx1" width="1218" height="1178"/>
<image name="imageView:wo0-AE-5XX:image" width="230" height="93">
<mutableData key="keyedArchiveRepresentation">
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T

View file

@ -1,53 +0,0 @@
//
// BLMBoardOverlay.swift
// Adafruit AR
//
// Created by Trevor Beaton on 2/24/21.
// Copyright © 2021 Vanguard Logic LLC. All rights reserved.
//
import SwiftUI
struct BLMBoardOverlay: View {
@State private var ZAxisRotation = false
var foreverAnimation: Animation {
Animation.linear(duration: 5.0)
.repeatForever(autoreverses: false)
}
var body: some View {
ZStack{
CircleText(radius: 100, text: " BLACK L IVES M ATTER BLACK L IVES M ATTER ", kerning: 0)
}
// .rotation3DEffect(Angle.degrees(ZAxisRotation ? -180 : 0), axis: (x: 0, y: 0, z: 1))
// .animation(ZAxisRotation ? foreverAnimation : .default)
// .onAppear(){
// self.ZAxisRotation.toggle()
// }
// .rotationEffect(.degrees(ZAxisRotation ? 360: 0))
// .animation(ZAxisRotation ? foreverAnimation : .default)
// .onAppear(){
// self.ZAxisRotation.toggle()
// }
// .rotationEffect(Angle(degrees: ZAxisRotation ? 360 : 0))
// .animation(ZAxisRotation ? foreverAnimation : .none)
// .onAppear(){
// self.ZAxisRotation.toggle()
// }
}
}
struct BLMBoardOverlay_Previews: PreviewProvider {
static var previews: some View {
BLMBoardOverlay()
}
}

View file

@ -1,358 +0,0 @@
//
// BoardViewController+Audio.swift
// Adafruit AR
//
// Created by Trevor Beaton on 12/12/20.
// Copyright © 2020 Vanguard Logic LLC. All rights reserved.
//
import AVFoundation
extension BoardViewController {
func playTemperanceAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/when things are easy.wav", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playStarAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/today why is more.wav", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playDeathAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/use great caution.wav", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playWOFAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/a good gauge.wav", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playJudgementAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/if the spectrum is.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playHermitAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/filtering out noise.wav", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playFourOfCoinAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/the best listeners.wav", ofType:nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playthmAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/footprints.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playtowerAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/misinformation.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playloversAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/just because there is.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playsunAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/make a megaphone.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playmoonAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/motion is noise.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playjusticeAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/not every container.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playworldAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/power to change.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playdevilAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/you've got the power.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playfoolAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/the process is more.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playpriestessAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/sometimes building a mistake.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playstrengthAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/showing up on time.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
func playmagicianAudio() {
let path = Bundle.main.path(forResource: "art.scnassets/wav/sometimes its not going.wav", ofType: nil)!
let url = URL(fileURLWithPath: path)
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.isMeteringEnabled = true
guard let audioPlayer = audioPlayer else { return }
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
}

View file

@ -1,620 +0,0 @@
//
// QRViewController+GestureRec.swift
// Adafruit AR
//
// Created by Trevor B on 4/24/19.
// Copyright © 2019 Adafruit. All rights reserved.
//
import UIKit
import ARKit
import SceneKit
extension BoardViewController {
//Gesture Recognizers & Actions
func registerTapRecognizer() {
let tapGestureRecognizer = UITapGestureRecognizer (target:self ,action : #selector (tapped))
self.boardSceneView.addGestureRecognizer(tapGestureRecognizer)
}
//Tap Gesture
@objc func tapped(sender: UITapGestureRecognizer) {
let sceneView = sender.view as! ARSCNView
let hitResults = sceneView.hitTest(view.center, types: .existingPlaneUsingExtent)
_ = sender.location(in: self.boardSceneView)
if !hitResults.isEmpty == false {
print("Surface Touched")
} else {
print("DID NOT LOAD NODE.")
}
if sender.state == .ended {
let location: CGPoint = sender.location(in: sceneView)
let hits = self.boardSceneView.hitTest(location, options: nil)
if hits.count > 0 {
let result = hits[0]
let node = result.node
fadeOut = SCNAction.fadeOut(duration: 1)
fadeIn = SCNAction.fadeIn(duration: 0.0001)
if (node.name) == "neopixel_Button" {
if cpxNeoPixelSwitch == false {
setCpxUI(Button: neoPixelButton, Display: neoPixelInfo)
let scale: Float = 0.0007
neoPixelInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.1), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
neoPixelInfo.runAction(scaleAction)
cpxNeoPixelSwitch = true
} else {
neoPixelButton.geometry!.firstMaterial?.transparency = 0.2
neoPixelInfo.removeAllActions()
neoPixelInfo.isHidden = true
cpxNeoPixelSwitch = false
}
}
else if (node.name) == "ATSAMD21_Micro_button" {
if cpxATSSwitch == false {
let scale: Float = 0.0007
ATSInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.3), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
setCpxUI(Button: ATSButton, Display: ATSInfo)
ATSInfo.runAction(scaleAction)
cpxATSSwitch = true
} else {
ATSButton.geometry!.firstMaterial?.transparency = 0.2
ATSInfo.removeAllActions()
ATSInfo.isHidden = true
cpxATSSwitch = false
}
}
else if (node.name) == "Croc_Button" {
if cpxCrocSwitch == false {
let scale: Float = 0.0007
crocInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.2), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
setCpxUI(Button: crocButton, Display: crocInfo)
crocInfo.runAction(scaleAction)
cpxCrocSwitch = true
} else {
crocButton.geometry!.firstMaterial?.transparency = 0.2
crocInfo.removeAllActions()
crocInfo.isHidden = true
cpxCrocSwitch = false
}
}
else if (node.name) == "temp_button" {
if cpxTempSwitch == false {
let scale: Float = 0.0007
temperatureDisplay.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.1), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
setCpxUI(Button: temperatureButton, Display: temperatureDisplay)
temperatureDisplay.runAction(scaleAction)
cpxTempSwitch = true
} else {
temperatureButton.geometry!.firstMaterial?.transparency = 0.2
temperatureDisplay.removeAllActions()
temperatureDisplay.isHidden = true
cpxTempSwitch = false
}
}
else if (node.name) == "speaker_button" {
if cpxSpeakSwitch == false {
let scale: Float = 0.0007
speakInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.1), duration: 2.2)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
speakInfo.runAction(scaleAction)
setCpxUI(Button: speakButton, Display: speakInfo)
cpxSpeakSwitch = true
} else {
speakButton.geometry!.firstMaterial?.transparency = 0.2
speakInfo.removeAllActions()
speakInfo.isHidden = true
cpxSpeakSwitch = false
}
}
else if (node.name) == "mic_button" {
if cpxMicSwitch == false {
let scale: Float = 0.0007
micInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.2), duration: 2.2)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
setCpxUI(Button: micButton, Display: micInfo)
micInfo.runAction(scaleAction)
cpxMicSwitch = true
} else {
micButton.geometry!.firstMaterial?.transparency = 0.2
micInfo.removeAllActions()
micInfo.isHidden = true
cpxMicSwitch = false
}
}
else if (node.name) == "py_Sensor_Button" {
if pySensorSwitch == false {
setPy(Button: pySensorButton, Display: pySensorInfo)
let scale: Float = 0.0007
pySensorInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.1), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pySensorButton.geometry!.firstMaterial?.transparency = 0.9
pySensorInfo.runAction(scaleAction)
pySensorSwitch = true
} else {
pySensorButton.geometry!.firstMaterial?.transparency = 0.2
pySensorInfo.removeAllActions()
pySensorInfo.isHidden = true
pySensorSwitch = false
}
}
else if (node.name) == "py_Wifi_Button" {
if pyWifiSwitch == false {
setPy(Button: pyWifiButton, Display: pyWifiInfo)
let scale: Float = 0.0007
pyWifiInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(1.1), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pyWifiButton.geometry!.firstMaterial?.transparency = 0.9
pyWifiInfo.runAction(scaleAction)
pyWifiSwitch = true
} else {
pyWifiButton.geometry!.firstMaterial?.transparency = 0.2
pyWifiInfo.removeAllActions()
pyWifiInfo.isHidden = true
pyWifiSwitch = false
}
}
else if (node.name) == "py_ATSAMD_Button" {
if pyATSSwitch == false {
setPy(Button: pyATSButton, Display: pyATSInfo)
let scale: Float = 0.0007
pyATSInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(0.9), duration: 1.6)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pyATSButton.geometry!.firstMaterial?.transparency = 0.9
pyATSInfo.runAction(scaleAction)
pyATSSwitch = true
} else {
pyATSButton.geometry!.firstMaterial?.transparency = 0.2
pyATSInfo.removeAllActions()
pyATSInfo.isHidden = true
pyATSSwitch = false
}
}
else if (node.name) == "py_Speaker_Button" {
if pySpeakerSwitch == false {
setPy(Button: pySpeakerButton, Display: pySpeakerInfo)
let scale: Float = 0.0007
pySpeakerInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(0.8), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pySpeakerInfo.runAction(scaleAction)
pySpeakerSwitch = true
} else {
pySpeakerButton.geometry!.firstMaterial?.transparency = 0.2
pySpeakerInfo.removeAllActions()
pySpeakerInfo.isHidden = true
pySpeakerSwitch = false
}
}
else if (node.name) == "py_Connector_Button" {
if pyConnectorSwitch == false {
setPy(Button: pyConnectorButton, Display: pyConnectorInfo)
let scale: Float = 0.0007
pyConnectorInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(0.9), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pyConnectorInfo.runAction(scaleAction)
pyConnectorSwitch = true
} else {
pyConnectorButton.geometry!.firstMaterial?.transparency = 0.2
pyConnectorInfo.removeAllActions()
pyConnectorInfo.isHidden = true
pyConnectorSwitch = false
}
}
else if (node.name) == "py_IC2_Button" {
if pyIC2Switch == false {
setPy(Button: pyIC2Button, Display: pyIC2Info)
let scale: Float = 0.0007
pyIC2Info.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(0.8), duration: 1.5
)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pyIC2Info.runAction(scaleAction)
pyIC2Switch = true
} else {
pyIC2Button.geometry!.firstMaterial?.transparency = 0.2
pyIC2Info.removeAllActions()
pyIC2Info.isHidden = true
pyIC2Switch = false
}
}
else if (node.name) == "py_D_A_Button" {
if pyDASwitch == false {
setPy(Button: pyDAButton, Display: pyDAInfo)
let scale: Float = 0.0007
pyDAInfo.scale = SCNVector3(x: scale, y: scale, z: scale)
let scaleAction = SCNAction.scale(to: CGFloat(0.9), duration: 1.8)
scaleAction.timingMode = .linear
// Use a custom timing function
scaleAction.timingFunction = { (p: Float) in
return self.easeOutElastic(p)
}
pyDAInfo.runAction(scaleAction)
pyDASwitch = true
} else {
pyDAButton.geometry!.firstMaterial?.transparency = 0.2
pyDAInfo.removeAllActions()
pyDAInfo.isHidden = true
pyDASwitch = false
}
}
else {
print("Nothing Detected.")
}
}
}
}
func setCpxUI(Button: SCNNode, Display: SCNNode) {
print("\(Button.name ?? "") was pressed and " + "\(Display.name ?? "") was displayed")
Button.isHidden = false
Button.geometry!.firstMaterial?.transparency = 0.9
Display.isHidden = false
CPXButtons = CPXButtons.filter { $0 != Button }
CPXDisplays = CPXDisplays.filter { $0 != Display }
CPXButtons.forEach { button in
button.geometry!.firstMaterial?.transparency = 0.2
}
CPXDisplays.forEach { display in
display.isHidden = true
}
CPXButtons = [ATSButton, micButton, crocButton, temperatureButton, speakButton,neoPixelButton]
CPXDisplays = [crocInfo, speakInfo, ATSInfo, temperatureDisplay,micInfo, neoPixelInfo]
// //Circuit Playground Interaction Test
// cpxNeoPixelSwitch = false
//
// cpxATSSwitch = false
//
// cpxCrocSwitch = false
//
// cpxTempSwitch = false
//
// cpxSpeakSwitch = false
//
// cpxMicSwitch = false
}
func setPy(Button: SCNNode, Display: SCNNode) {
print("\(Button.name ?? "") was pressed and " + "\(Display.name ?? "") was displayed")
Button.isHidden = false
Button.geometry!.firstMaterial?.transparency = 0.9
Display.isHidden = false
PyButtons = PyButtons.filter { $0 != Button }
PyDisplays = PyDisplays.filter { $0 != Display }
PyButtons.forEach { button in
button.geometry!.firstMaterial?.transparency = 0.2
}
PyDisplays.forEach { display in
display.isHidden = true
}
PyButtons = [pyATSButton, pySensorButton, pyDAButton, pySpeakerButton, pyWifiButton, pyIC2Button, pyConnectorButton]
PyDisplays = [pyATSInfo, pySpeakerInfo, pyDAInfo, pyWifiInfo, pySensorInfo, pyConnectorInfo, pyIC2Info]
// pyATSSwitch = false
//
// pyIC2Switch = false
//
// pySensorSwitch = false
//
// pySpeakerSwitch = false
//
// pyDASwitch = false
//
// pyWifiSwitch = false
//
// pyConnectorSwitch = false
}
}

View file

@ -1,229 +0,0 @@
//
// BoardViewController+HostingControllers.swift
// Adafruit AR
//
// Created by Trevor Beaton on 12/12/20.
// Copyright © 2020 Vanguard Logic LLC. All rights reserved.
//
import ARKit
import SwiftUI
extension BoardViewController {
func arHostingController(for node: SCNNode, textForDialogue: [String]) {
// create a hosting controller with SwiftUI view
let arVC = UIHostingController(rootView: SwiftUITarotCardView(minervaDialogue: textForDialogue))
// Do this on the main thread
DispatchQueue.main.async {
arVC.willMove(toParent: self)
// make the hosting VC a child to the main view controller
self.addChildViewController(arVC)
// set the pixel size of the Card View
arVC.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
// add the ar card view as a subview to the main view
self.view.addSubview(arVC.view)
// render the view on the plane geometry as a material
self.show(hostingVC: arVC, on: node)
}
}
func show(hostingVC: UIHostingController<SwiftUITarotCardView>, on node: SCNNode) {
// create a new material
let material = SCNMaterial()
// this allows the card to render transparent parts the right way
hostingVC.view.isOpaque = false
// set the diffuse of the material to the view of the Hosting View Controller
material.diffuse.contents = hostingVC.view
material.lightingModel = .constant
// Set the material to the geometry of the node (plane geometry)
node.geometry?.materials = [material]
hostingVC.view.backgroundColor = UIColor.clear
}
func arPICOHostingController(for node: SCNNode) {
// Do this on the main thread
DispatchQueue.main.async {
// make the hosting VC a child to the main view controller
// self.addChildViewController(self.arVC)
// set the pixel size of the Card View
self.arVC.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
// add the ar card view as a subview to the main view
self.view.addSubview(self.arVC.view)
// render the view on the plane geometry as a material
self.showOverlay(hostingVC: self.arVC, on: node)
// self.arVC.willMove(toParent: self)
self.arVC.didMove(toParent: self)
}
}
func showOverlay(hostingVC: UIHostingController<PICOBoardOverlay>, on node: SCNNode) {
// create a new material
let material = SCNMaterial()
// this allows the card to render transparent parts the right way
hostingVC.view.isOpaque = false
// set the diffuse of the material to the view of the Hosting View Controller
material.diffuse.contents = hostingVC.view
material.lightingModel = .constant
// Set the material to the geometry of the node (plane geometry)
node.geometry?.materials = [material]
hostingVC.view.backgroundColor = UIColor.clear
}
func arBLMHostingController(for node: SCNNode) {
// Do this on the main thread
DispatchQueue.main.async {
// make the hosting VC a child to the main view controller
// self.addChildViewController(self.arVC)
// set the pixel size of the Card View
self.blmVC.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
// add the ar card view as a subview to the main view
self.view.addSubview(self.blmVC.view)
// render the view on the plane geometry as a material
self.showBLMOverlay(hostingVC: self.blmVC, on: node)
// self.arVC.willMove(toParent: self)
self.blmVC.didMove(toParent: self)
}
}
func showBLMOverlay(hostingVC: UIHostingController<BLMBoardOverlay>, on node: SCNNode) {
// create a new material
let material = SCNMaterial()
// this allows the card to render transparent parts the right way
hostingVC.view.isOpaque = false
// set the diffuse of the material to the view of the Hosting View Controller
material.diffuse.contents = hostingVC.view
material.lightingModel = .constant
// Set the material to the geometry of the node (plane geometry)
node.geometry?.materials = [material]
hostingVC.view.backgroundColor = UIColor.clear
}
func arTeensy41HostingController(for node: SCNNode) {
print(#function)
// Do this on the main thread
DispatchQueue.main.async {
// make the hosting VC a child to the main view controller
// self.addChildViewController(self.arVC)
// set the pixel size of the Card View
self.teensyVC.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
// add the ar card view as a subview to the main view
self.view.addSubview(self.teensyVC.view)
// render the view on the plane geometry as a material
self.showTeensyOverlay(hostingVC: self.teensyVC, on: node)
// self.arVC.willMove(toParent: self)
self.teensyVC.didMove(toParent: self)
}
}
func showTeensyOverlay(hostingVC: UIHostingController<Teensy41BoardOverlay>, on node: SCNNode) {
print(#function)
DispatchQueue.main.async {
// create a new material
let material = SCNMaterial()
// this allows the card to render transparent parts the right way
hostingVC.view.isOpaque = false
// set the diffuse of the material to the view of the Hosting View Controller
material.diffuse.contents = hostingVC.view
material.lightingModel = .constant
// Set the material to the geometry of the node (plane geometry)
node.geometry?.materials = [material]
hostingVC.view.backgroundColor = UIColor.clear
}
}
func arpi400HostingController(for node: SCNNode) {
// Do this on the main thread
DispatchQueue.main.async {
// make the hosting VC a child to the main view controller
// self.addChildViewController(self.arVC)
// set the pixel size of the Card View
self.pi400VC.view.frame = CGRect(x: 0, y: 0, width: 1000, height: 500)
// add the ar card view as a subview to the main view
self.view.addSubview(self.pi400VC.view)
// render the view on the plane geometry as a material
self.showpi400Overlay(hostingVC: self.pi400VC, on: node)
// self.arVC.willMove(toParent: self)
self.pi400VC.didMove(toParent: self)
}
}
func showpi400Overlay(hostingVC: UIHostingController<Pi400Overlay>, on node: SCNNode) {
// create a new material
let material = SCNMaterial()
// this allows the card to render transparent parts the right way
hostingVC.view.isOpaque = false
// set the diffuse of the material to the view of the Hosting View Controller
material.diffuse.contents = hostingVC.view
material.lightingModel = .constant
// Set the material to the geometry of the node (plane geometry)
node.geometry?.materials = [material]
hostingVC.view.backgroundColor = UIColor.clear
}
}

View file

@ -1,26 +0,0 @@
//
// CurvedText.swift
// Adafruit AR
//
// Created by Trevor Beaton on 2/24/21.
// Copyright © 2021 Vanguard Logic LLC. All rights reserved.
//
import SwiftUI
struct CurvedText: View {
var body: some View {
RoundedRectangle(cornerRadius: 1, style: .continuous)
.fill(Color.clear)
.frame(width: 200, height: 200)
.border(Color.gray, width: 2)
.position(x: 250, y: 250)
}
}
struct CurvedText_Previews: PreviewProvider {
static var previews: some View {
CurvedText()
}
}

View file

@ -1,371 +0,0 @@
//
// PICOBoardOverlay.swift
// Adafruit AR
//
// Created by Trevor Beaton on 1/26/21.
// Copyright © 2021 Vanguard Logic LLC. All rights reserved.
//
import SwiftUI
struct Data: Identifiable {
let id = UUID()
let value: String
let prefix: String
let fgColor: Color
let bgcolor: Color
let prefix2: String
let bgColor2: Color
let prefix3: String
let bgColor3: Color
let prefix4: String
let bgColor4: Color
let prefix5: String
let bgColor5: Color
}
struct PICOBoardOverlay: View {
@State private var viewY = 0
@State private var debugY = 0
var body: some View {
let data = [Data(value: "40",prefix:"VBUS", fgColor: .white, bgcolor: .red, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "39", prefix: "VSYS", fgColor: .white, bgcolor: .red,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "38", prefix: "GND", fgColor: .white, bgcolor: .black,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "37", prefix: "3V3_EN", fgColor: .black, bgcolor: .gray, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "36", prefix: "3V3", fgColor: .white, bgcolor: .red, prefix2: "300 mA Max", bgColor2: .black, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "35", prefix: "ADC_VREF", fgColor: .black, bgcolor: .orange, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "34", prefix: "GP28", fgColor: .black, bgcolor: .yellow, prefix2: "PWM6A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI1", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "GP28_A2", bgColor5: .orange),
Data(value: "33", prefix: "GND", fgColor: .white, bgcolor: .black, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "32", prefix: "GP27",fgColor: .black, bgcolor: .yellow, prefix2: "PWM5B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "D01", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "GP26_A0", bgColor5: .orange),
Data(value: "31", prefix: "GP26", fgColor: .black, bgcolor: .yellow, prefix2: "PWM5A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "SCK1", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "GP27_A0", bgColor5: .orange),
Data(value: "30", prefix: "RUN/RESET", fgColor: .black, bgcolor: .gray, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "29", prefix: "GP22", fgColor: .black, bgcolor: .yellow, prefix2: "PWM3A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "SCK0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "28", prefix: "GND", fgColor: .white, bgcolor: .black, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "27", prefix: "GP21", fgColor: .black, bgcolor: .yellow, prefix2: "PWM2B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "RX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "26", prefix: "GP20", fgColor: .black, bgcolor: .yellow, prefix2: "PWM2A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "25", prefix: "GP19", fgColor: .black, bgcolor: .yellow, prefix2: "PWM1B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "D00", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "24", prefix: "GP18", fgColor: .black, bgcolor: .yellow, prefix2: "PWM1A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "SCK0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "23", prefix: "GND", fgColor: .white, bgcolor: .black, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "22", prefix: "GP17", fgColor: .black, bgcolor: .yellow, prefix2: "PWM0B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "21", prefix: "GP16", fgColor: .black, bgcolor: .yellow, prefix2: "PWM0A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX0", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1)))
]
let data2 = [Data(value: "1",prefix:"GP0", fgColor: .black, bgcolor: .yellow, prefix2: "PWM0A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX0", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "2",prefix:"GP1", fgColor: .black, bgcolor: .yellow, prefix2: "PWM0B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "RX0", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "3", prefix: "GND", fgColor: .white, bgcolor: .black,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "4",prefix:"GP2", fgColor: .black, bgcolor: .yellow, prefix2: "PWM1A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "SCK0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "5",prefix:"GP3", fgColor: .black, bgcolor: .yellow, prefix2: "PWM1B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "D00", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "6",prefix:"GP4", fgColor: .black, bgcolor: .yellow, prefix2: "PWM2A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCA0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "7", prefix: "GP5", fgColor: .black, bgcolor: .yellow, prefix2: "PWM2B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "RX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "8",prefix:"GND", fgColor: .white, bgcolor: .black, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear ,prefix5: "", bgColor5: .clear),
Data(value: "9",prefix:"GP6", fgColor: .black, bgcolor: .yellow, prefix2: "PWM3A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "SCK0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "10", prefix: "GP7", fgColor: .black, bgcolor: .yellow, prefix2: "PWM5B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "D00", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDL1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "11", prefix: "GP8", fgColor: .black, bgcolor: .yellow, prefix2: "PWM4A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI1", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "12", prefix: "GP9", fgColor: .black, bgcolor: .yellow, prefix2: "PWM4B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS1", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "RX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "13", prefix: "GND", fgColor: .white, bgcolor: .black,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "14", prefix: "GP10", fgColor: .black, bgcolor: .yellow, prefix2: "PWM5A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "SCK1", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "15", prefix: "GP11", fgColor: .black, bgcolor: .yellow, prefix2: "PWM2A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "DI0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX1", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "16", prefix: "GP12", fgColor: .black, bgcolor: .yellow, prefix2: "PWM5B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "D01", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "TX0", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "17", prefix: "GP13", fgColor: .black, bgcolor: .yellow, prefix2: "PWM6B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS1", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SCL0", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "RX0", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "18", prefix: "GND", fgColor: .white, bgcolor: .black, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "19", prefix: "GP14", fgColor: .black, bgcolor: .yellow, prefix2: "PWM7A", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "CS0", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "SDA1", bgColor4: Color(#colorLiteral(red: 0.8072112728, green: 0.6713793157, blue: 0.9686274529, alpha: 1)),prefix5: "", bgColor5: Color(#colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))),
Data(value: "20", prefix: "GP15", fgColor: .black, bgcolor: .yellow, prefix2: "PWM7B", bgColor2: Color(#colorLiteral(red: 0.3326305836, green: 0.9686274529, blue: 0.6167510894, alpha: 1)), prefix3: "", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear)
]
ZStack{
//Border
RoundedRectangle(cornerRadius: 1, style: .continuous)
.fill(Color.clear)
.frame(width: 167, height: 272)
.border(Color.gray, width: 2)
.position(x: 250, y: CGFloat(viewY))
//.position(x: 250, y: 250)
pintOutDEBUGStruct()
.position(x: 250, y: CGFloat(debugY))
HStack{
VStack(alignment: .leading) {
ForEach(data) { (pinout) in
pintOutStruct(value: pinout.value, prefix: pinout.prefix, fgcolor: pinout.fgColor, bgcolor: pinout.bgcolor, prefix2: pinout.prefix2, bgColor2: pinout.bgColor2, prefix3: pinout.prefix3, bgColor3: pinout.bgColor3, prefix4: pinout.prefix4, bgColor4: pinout.bgColor4, prefix5: pinout.prefix5, bgColor5: pinout.bgColor5)
}
.frame(width: 170, height: 13.5, alignment: .leading)
}
.position(x: 418, y: CGFloat(viewY))
//.offset(x: 245, y: 23.8)
VStack(alignment: .trailing) {
ForEach(data2) { (pinout) in
pintOutStruct2(value: pinout.value, prefix: pinout.prefix, fgcolor: pinout.fgColor, bgcolor: pinout.bgcolor, prefix2: pinout.prefix2, bgColor2: pinout.bgColor2, prefix3: pinout.prefix3, bgColor3: pinout.bgColor3, prefix4: pinout.prefix4, bgColor4: pinout.bgColor4, prefix5: pinout.prefix5, bgColor5: pinout.bgColor5)
}
.frame(width: 150, height: 13.4, alignment: .trailing)
}
.position(x: -161, y: CGFloat(viewY))
//.offset(x: -245, y: 25)
}
}
.onAppear(perform: {
if UIDevice.current.userInterfaceIdiom == .phone {
//iPhone
viewY = 217
debugY = 370
}else {
//iPad
viewY = 250
debugY = 400
}
})
.rotationEffect(.degrees(-180))
}
}
struct pintOutDEBUGStruct: View {
var body: some View {
VStack(alignment: .trailing){
Text("SWCLK")
.font(.system(size: 7))
.fontWeight(.black)
.foregroundColor(.black)
.background(Color.gray)
.padding(0.2)
Text("GND")
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(Color.white)
.background(Color.black)
.padding(0.2)
Text("SWDI0")
.font(.system(size: 7))
.fontWeight(.black)
.foregroundColor(Color.black)
.background(Color.gray)
.padding(0.2)
}
.rotationEffect(.degrees(-90))
}
}
struct pintOutStruct: View {
let value: String
let prefix: String
let fgcolor: Color
let bgcolor: Color
let prefix2: String
let bgColor2: Color
let prefix3: String
let bgColor3: Color
let prefix4: String
let bgColor4: Color
let prefix5: String
let bgColor5: Color
var body: some View {
HStack(spacing: 4.0){
Text(value)
.font(.system(size: 8))
.fontWeight(.semibold)
.foregroundColor(.white)
.multilineTextAlignment(.trailing)
.background(Color.gray)
Text(prefix)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgcolor)
// .font(.custom("Helvetica Neue", size: 10))
Text(prefix2)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor2)
// .font(.custom("Helvetica Neue", size: 10))
Text(prefix3)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor3)
Text(prefix4)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor4)
Text(prefix5)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor5)
}
}
}
struct pintOutStruct2: View {
let value: String
let prefix: String
let fgcolor: Color
let bgcolor: Color
let prefix2: String
let bgColor2: Color
let prefix3: String
let bgColor3: Color
let prefix4: String
let bgColor4: Color
let prefix5: String
let bgColor5: Color
var body: some View {
HStack(spacing: 4.0){
Text(prefix5)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor5)
Text(prefix4)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor4)
.cornerRadius(25)
Text(prefix3)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor3)
Text(prefix2)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgColor2)
Text(prefix)
.font(.system(size: 8))
.fontWeight(.black)
.foregroundColor(fgcolor)
.background(bgcolor)
Text(value)
.font(.system(size: 8))
.fontWeight(.semibold)
.foregroundColor(.white)
.multilineTextAlignment(.trailing)
.foregroundColor(.black)
.background(Color.gray)
}
}
}
struct PICOBoardOverlay_Previews: PreviewProvider {
static var previews: some View {
PICOBoardOverlay()
.previewDevice(PreviewDevice(rawValue: "iPad Pro (11-inch) (2nd generation)"))
.previewDisplayName("iPhone 11 Max")
}
}

View file

@ -1,314 +0,0 @@
//
// PICOBoardOverlay.swift
// Adafruit AR
//
// Created by Trevor Beaton on 1/26/21.
// Copyright © 2021 Vanguard Logic LLC. All rights reserved.
//
import SwiftUI
struct pi400Data: Identifiable {
let id = UUID()
let pinOutLabel: String
let pinOutBGcolor: Color
let pinOutFGcolor: Color
let pinOutLabel2: String
let pinOutBGcolor2: Color
let pinOutFGcolor2: Color
let GPIONumber: String
let circleColor: Color
}
struct Pi400Overlay: View {
@State private var viewY = 0
@State private var debugY = 0
var body: some View {
let pi400DataFirstRow = [
pi400Data(pinOutLabel: "5V", pinOutBGcolor: Color(#colorLiteral(red: 1, green: 0.3383003439, blue: 0.348613691, alpha: 1)), pinOutFGcolor: .white, pinOutLabel2: "Power", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .red),
pi400Data(pinOutLabel: "5V", pinOutBGcolor: Color(#colorLiteral(red: 1, green: 0.3383003439, blue: 0.348613691, alpha: 1)), pinOutFGcolor: .white, pinOutLabel2: "Power", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .red),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "11", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 14", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(TXD)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "8", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 15", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(RXD)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "10", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 18", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "PCM_CLK", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "12", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "11", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 23", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "16", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 24", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "18", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "11", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 25", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "22", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 8", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(CE0)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "24", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 7", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(CE1)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "26", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 1", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(ID_SC)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "28", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "11", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 12", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(PWM0)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "32", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "11", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 16", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "36", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 20", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "PCM_DIN", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "38", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 21", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "PCM_OUT", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "40", circleColor: .yellow),
]
let pi400DataSecondRow = [
pi400Data(pinOutLabel: "3V3", pinOutBGcolor: Color(#colorLiteral(red: 1, green: 0.3383003439, blue: 0.348613691, alpha: 1)), pinOutFGcolor: .white, pinOutLabel2: "Power", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .red),
pi400Data(pinOutLabel: "GPIO 2", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(SDA)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "3", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 3", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(SCL)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "5", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 4", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(GPCLK0)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "7", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 17", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "11", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 27", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "13", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 22", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "15", circleColor: .yellow),
pi400Data(pinOutLabel: "3V3", pinOutBGcolor: Color(#colorLiteral(red: 1, green: 0.3383003439, blue: 0.348613691, alpha: 1)), pinOutFGcolor: .white, pinOutLabel2: "Power", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .red),
pi400Data(pinOutLabel: "GPIO 10", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(MOSI)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "19", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 9", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(MISO)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "21", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 11", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(SCLK)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "23", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .black),
pi400Data(pinOutLabel: "GPIO 0", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(ID_SC)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "27", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 5", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "29", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 6", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "31", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 13", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "(PWM1)", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "33", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 19", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "PCM_FS", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "35", circleColor: .yellow),
pi400Data(pinOutLabel: "GPIO 26", pinOutBGcolor: Color(#colorLiteral(red: 0.9994240403, green: 0.9855536819, blue: 0, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "37", circleColor: .yellow),
pi400Data(pinOutLabel: "Ground", pinOutBGcolor: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), pinOutFGcolor: .black, pinOutLabel2: "", pinOutBGcolor2: .clear, pinOutFGcolor2: .blue, GPIONumber: "", circleColor: .black)
]
VStack{
HStack() {
ForEach(pi400DataFirstRow) { (pinout) in
pi400GPIOUpperRow(pinOutLabel: pinout.pinOutLabel, pinOutBGcolor: pinout.pinOutBGcolor, pinOutFGcolor: pinout.pinOutFGcolor, pinOutLabel2: pinout.pinOutLabel2, pinOutBGcolor2: pinout.pinOutBGcolor2, pinOutFGcolor2: pinout.pinOutFGcolor2, GPIONumber: pinout.GPIONumber, circleColor: pinout.circleColor)
}
.frame(width: 12, height: 40)
}
.position(x: 0, y: -50)
HStack() {
ForEach(pi400DataSecondRow) { (pinout) in
pi400GPIOLowerRow(pinOutLabel: pinout.pinOutLabel, pinOutBGcolor: pinout.pinOutBGcolor, pinOutFGcolor: pinout.pinOutFGcolor, pinOutLabel2: pinout.pinOutLabel2, pinOutBGcolor2: pinout.pinOutBGcolor2, pinOutFGcolor2: pinout.pinOutFGcolor2, GPIONumber: pinout.GPIONumber, circleColor: pinout.circleColor)
}
.frame(width: 12, height: 40)
}
.position(x: 0, y: 25)
}
.onAppear(perform: {
if UIDevice.current.userInterfaceIdiom == .phone {
//iPhone
viewY = 220
}else {
//iPad
viewY = 255
}
})
.fixedSize(horizontal: true, vertical: true)
// .rotationEffect(.degrees(-90))
}
struct pi400GPIOUpperRow: View {
let pinOutLabel: String
let pinOutBGcolor: Color
let pinOutFGcolor: Color
let pinOutLabel2: String
let pinOutBGcolor2: Color
let pinOutFGcolor2: Color
let GPIONumber: String
let circleColor: Color
var body: some View {
VStack{
VStack{
Text(pinOutLabel)
.foregroundColor(pinOutFGcolor)
.font(.system(size: 8))
.fontWeight(.bold)
.frame(width: 35, height: 10)
.background(pinOutBGcolor)
Text(pinOutLabel2)
.foregroundColor(pinOutFGcolor)
.font(.system(size: 6))
.fontWeight(.medium)
.frame(width: 35, height: 10)
.background(pinOutBGcolor)
}
.rotationEffect(.degrees(-90))
//Circle Group
ZStack {
//Circle
Circle()
.foregroundColor(circleColor)
//Text within the circle
Text(GPIONumber)
.font(.system(size: 10))
.fontWeight(.regular)
}
.frame(width: 15, height: 15)
.padding(.top, 5)
// Rectangle()
// .frame(width: 2, height: 70)
}
}
}
struct pi400GPIOLowerRow: View {
let pinOutLabel: String
let pinOutBGcolor: Color
let pinOutFGcolor: Color
let pinOutLabel2: String
let pinOutBGcolor2: Color
let pinOutFGcolor2: Color
let GPIONumber: String
let circleColor: Color
var body: some View {
VStack{
//Circle Group
ZStack {
//Circle
Circle()
.foregroundColor(circleColor)
//Text within the circle
Text(GPIONumber)
.font(.system(size: 10))
.fontWeight(.medium)
}
.frame(width: 15, height: 15)
.padding(.bottom, 5)
VStack{
Text(pinOutLabel)
.foregroundColor(pinOutFGcolor)
.font(.system(size: 8))
.fontWeight(.bold)
.frame(width: 35, height: 10)
.background(pinOutBGcolor)
Text(pinOutLabel2)
.foregroundColor(pinOutFGcolor)
.font(.system(size: 6))
.fontWeight(.medium)
.frame(width: 35, height: 10)
.background(pinOutBGcolor)
}
.rotationEffect(.degrees(-90))
}
}
}
struct Pi400Overlay_Previews: PreviewProvider {
static var previews: some View {
Pi400Overlay()
.previewDevice(PreviewDevice(rawValue: "iPad Pro (11-inch) (2nd generation)"))
.previewDisplayName("iPad Pro (11-inch) (2nd generation)")
}
}
}

View file

@ -1,97 +0,0 @@
import SwiftUI
import UIKit
import AVFoundation
@available(iOS 13.0, *)
struct SwiftUITarotCardView: View {
let minervaDialogue : [String]
@State var displayText = ""
@State private var introTextOpacity = 0.0
func minervaSpeech() {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.displayText = self.minervaDialogue[0]
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.displayText = self.minervaDialogue[1]
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.displayText = self.minervaDialogue[2]
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.displayText = self.minervaDialogue[3]
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.displayText = self.minervaDialogue[4]
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.displayText = self.minervaDialogue[5]
}
}
}
}
}
}
}
var body: some View {
ZStack {
ZStack {
if #available(iOS 14.0, *) {
Text(displayText)
.foregroundColor(.white)
.font(.title)
.fontWeight(.bold)
.transition(.opacity)
.rotationEffect(.degrees(-180))
.offset(x: 0, y: -200)
.onAppear(perform: {
minervaSpeech()
})
}
}
}
}
struct SwiftUITarotCardView_Previews: PreviewProvider {
@available(iOS 13.0.0, *)
static var previews: some View {
SwiftUITarotCardView(minervaDialogue: [""])
}
}
}

View file

@ -1,195 +0,0 @@
//
// PICOBoardOverlay.swift
// Adafruit AR
//
// Created by Trevor Beaton on 1/26/21.
// Copyright © 2021 Vanguard Logic LLC. All rights reserved.
//
import SwiftUI
struct Teensy41BoardOverlay: View {
@State private var viewY = 0
@State private var debugY = 0
var body: some View {
let data = [
Data(value: "",prefix:"Vin (3.6 to 5.5 Volts)", fgColor: .white, bgcolor: .red, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "",prefix:"GND", fgColor: .white, bgcolor: .black,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "",prefix:"3.3V (250 mA max)", fgColor: .white, bgcolor: .red, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "23", prefix: "A9", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "CRX1", bgColor2: Color(#colorLiteral(red: 1, green: 0.6997302593, blue: 0.8755037922, alpha: 1)), prefix3: "MCLK1", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "22", prefix: "A8", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "CTX1", bgColor2: Color(#colorLiteral(red: 1, green: 0.6997302593, blue: 0.8755037922, alpha: 1)), prefix3: " ", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "21", prefix: "A7", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "RX5", bgColor2: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix3: "BCLK1", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "20", prefix: "A6", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "TX5", bgColor2: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix3: "LRCLK1", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "19", prefix: "A5", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: " ", bgColor2: .clear, prefix3: "SCL", bgColor3: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "18", prefix: "A4", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: " ", bgColor2: .clear, prefix3: "SDA", bgColor3: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "17", prefix: "A3", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "TX4", bgColor2: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix3: "SDA1", bgColor3: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "16", prefix: "A2", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "RX4", bgColor2: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix3: "SCL1", bgColor3: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "15", prefix: "A1", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "RX3", bgColor2: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix3: "S/PDIF IN", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "14", prefix: "A0", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "TX3", bgColor2: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix3: "S/PDIF OUT", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "13", prefix: "(LED)", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix2: "SCK", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: " ", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "",prefix:"GND", fgColor: .white, bgcolor: .black,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "41",prefix:"A17", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "", bgColor2:.clear, prefix3: "", bgColor3: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix4: "", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "40",prefix:"A16", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "", bgColor2:.clear, prefix3: "", bgColor3: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix4: "", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "39", prefix: "A15", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "MISO1", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "OUT1A", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "38", prefix: "A14", fgColor: .black, bgcolor: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)), prefix2: "CS1", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "IN1", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "37", prefix: " ", fgColor: .black, bgcolor: .clear, prefix2: "CS", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "36", prefix: " ", fgColor: .black, bgcolor: .clear, prefix2: "CS", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "35", prefix: "TX8", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "34", prefix: "RX8", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: Color(#colorLiteral(red: 0.8178200382, green: 0.6525374868, blue: 1, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "33", prefix: " ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2: .clear, prefix3: "MCLK2", bgColor3: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)), prefix4: "", bgColor4: .clear,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)))
]
let data2 = [
Data(value: "",prefix:"GND", fgColor: .white, bgcolor: .black,prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "0",prefix:"RX1", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix2: "CS1", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "CRX2", bgColor3: Color(#colorLiteral(red: 1, green: 0.7170018578, blue: 0.7933105978, alpha: 1)), prefix4: "PWM", bgColor4: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "1",prefix:"TX1", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix2: "MISO1", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "CTX2", bgColor3: Color(#colorLiteral(red: 1, green: 0.7170018578, blue: 0.7933105978, alpha: 1)), prefix4: "PWM", bgColor4: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "2",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "OUT2", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "3",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "LRCLK2", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "4",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "BCLK2", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "5",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "IN2", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "6",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "OUT1D", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "7",prefix:"RX2", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "OUT1A", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "8",prefix:"TX2", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "IN1", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "9",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: " ", bgColor2: .clear, prefix3: " ", bgColor3: .clear, prefix4: "OUT1C", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "10",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2:.clear, prefix3: "CS", bgColor3: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix4: "OUT1D", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "11",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2:.clear, prefix3: "MOSI", bgColor3: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix4: "CTX1", bgColor4: Color(#colorLiteral(red: 1, green: 0.7170018578, blue: 0.7933105978, alpha: 1)) ,prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "12",prefix:" ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2:.clear, prefix3: "MISO", bgColor3: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix4: "MQSL", bgColor4: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "",prefix:"3.3V",fgColor: .white, bgcolor: .red, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "", bgColor5: .clear),
Data(value: "24", prefix: "A10", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1)), prefix2: "TX6", bgColor2: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix3: "SCL2", bgColor3: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix4: "PWM", bgColor4: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "25", prefix: "A11", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1)), prefix2: "RX6", bgColor2: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix3: "SDA2", bgColor3: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix4: "PWM", bgColor4: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "26", prefix: "A12", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1)), prefix2: "MOSI1", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "", bgColor4: Color(#colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "27", prefix: "A13", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1)), prefix2: "SCK1", bgColor2: Color(#colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)), prefix3: "", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "", bgColor4: Color(#colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1)),prefix5: "", bgColor5: .clear),
Data(value: "28", prefix: "RX7", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix2: " ", bgColor2: .clear, prefix3: "", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "", bgColor4: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "29", prefix: "TX7", fgColor: .black, bgcolor: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)), prefix2: " ", bgColor2: .clear, prefix3: "", bgColor3: Color(#colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)), prefix4: "", bgColor4: Color(#colorLiteral(red: 0.7311126544, green: 0.6819911648, blue: 0.9686274529, alpha: 1)),prefix5: "PWM", bgColor5: Color(#colorLiteral(red: 1, green: 0.7205477193, blue: 0.5445609691, alpha: 1))),
Data(value: "30", prefix: " ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "CRX3", bgColor5: Color(#colorLiteral(red: 1, green: 0.7170018578, blue: 0.7933105978, alpha: 1))),
Data(value: "31", prefix: " ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "CTX3", bgColor5: Color(#colorLiteral(red: 1, green: 0.7170018578, blue: 0.7933105978, alpha: 1))),
Data(value: "32", prefix: " ", fgColor: .black, bgcolor: .clear, prefix2: "", bgColor2: .clear, prefix3: "", bgColor3: .clear, prefix4: "", bgColor4: .clear,prefix5: "OUT1B", bgColor5: Color(#colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)))
]
ZStack{
//Border
RoundedRectangle(cornerRadius: 1, style: .continuous)
.fill(Color.clear)
.frame(width: 140, height: 282.5)
.border(Color.gray, width: 2)
.position(x: 250, y: CGFloat(viewY))
HStack{
VStack(alignment: .leading) {
ForEach(data) { (pinout) in
pintOutStruct(value: pinout.value, prefix: pinout.prefix, fgcolor: pinout.fgColor, bgcolor: pinout.bgcolor, prefix2: pinout.prefix2, bgColor2: pinout.bgColor2, prefix3: pinout.prefix3, bgColor3: pinout.bgColor3, prefix4: pinout.prefix4, bgColor4: pinout.bgColor4, prefix5: pinout.prefix5, bgColor5: pinout.bgColor5)
}
.frame(width: 150, height: 11.8, alignment: .leading)
}
.position(x: 395, y: CGFloat(viewY))
VStack(alignment: .trailing) {
ForEach(data2) { (pinout) in
pintOutStruct2(value: pinout.value, prefix: pinout.prefix, fgcolor: pinout.fgColor, bgcolor: pinout.bgcolor, prefix2: pinout.prefix2, bgColor2: pinout.bgColor2, prefix3: pinout.prefix3, bgColor3: pinout.bgColor3, prefix4: pinout.prefix4, bgColor4: pinout.bgColor4, prefix5: pinout.prefix5, bgColor5: pinout.bgColor5)
}
.frame(width: 150, height: 11.8, alignment: .trailing)
}
.position(x: -148, y: CGFloat(viewY))
}
}
.onAppear(perform: {
if UIDevice.current.userInterfaceIdiom == .phone {
//iPhone
viewY = 220
}else {
//iPad
viewY = 255
}
})
.rotationEffect(.degrees(-180))
}
}
struct Teensy41BoardOverlay_Previews: PreviewProvider {
static var previews: some View {
Teensy41BoardOverlay()
.previewDevice(PreviewDevice(rawValue: "iPhone 12 Pro Max"))
.previewDisplayName("iPhone 12 Pro Max")
}
}

View file

@ -14,7 +14,7 @@ struct ARScenes {
static let minervaScene = SCNScene(named: "art.scnassets/Minerva.scn")!
static let circuitPlaygroundLabelScene = SCNScene(named: "art.scnassets/CPX_Displays.scn")!
static let blmLabelScene = SCNScene(named: "art.scnassets/BLM_Display.scn")!
static let blmLabelScene = SCNScene(named: "art.scnassets/TestPlane.scn")!
//MARK:- Tarot Cards

View file

@ -0,0 +1,50 @@
//
// ARImageCollectionViewCell.swift
// Adafruit AR
//
// Created by Trevor Beaton on 4/10/23.
// Copyright © 2023 Vanguard Logic LLC. All rights reserved.
//
import UIKit
class CustomCollectionViewCell: UICollectionViewCell {
static let identifier = "CustomCollectionViewCell"
private let imageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
imageView.clipsToBounds = true
return imageView
}()
private let nameLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = UIFont(name: "AvenirNext-Regular", size: 14)
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
contentView.addSubview(imageView)
contentView.addSubview(nameLabel)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
imageView.frame = CGRect(x: 0, y: 0, width: contentView.frame.size.width, height: contentView.frame.size.height - 20)
nameLabel.frame = CGRect(x: 0, y: contentView.frame.size.height - 20, width: contentView.frame.size.width, height: 20)
}
func configure(with image: UIImage, name: String) {
imageView.image = image
nameLabel.text = name
}
}

View file

@ -0,0 +1,95 @@
//
// ARImageCollectionViewController.swift
// Adafruit AR
//
// Created by Trevor Beaton on 4/10/23.
// Copyright © 2023 Vanguard Logic LLC. All rights reserved.
//
import UIKit
class ARImageCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
// Replace with your image names in the "Photos" folder.
let images: [String] = ["Circuit Playground Express","Circuit Playground Bluefruit", "Clue", "RaspPi Pico", "RaspPi Pico W", "ESP32-S2 TFT", "ESP32-S2 Rev TFT", "Teensy 4.1"]
weak var delegate: PhotosViewControllerDelegate?
let appTitleLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "SELECT A BOARD"
label.font = UIFont(name: "AvenirNext-DemiBold", size: 32)
return label
}()
lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: view.frame.size.width/3 - 20, height: view.frame.size.width/3)
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.register(CustomCollectionViewCell.self, forCellWithReuseIdentifier: CustomCollectionViewCell.identifier)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.dataSource = self
collectionView.delegate = self
return collectionView
}()
func addSubViews() {
view.addSubview(appTitleLabel)
view.addSubview(collectionView)
view.backgroundColor = .backgroundColor
collectionView.backgroundColor = .backgroundColor
NSLayoutConstraint.activate([
appTitleLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 50),
appTitleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
appTitleLabel.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor),
collectionView.topAnchor.constraint(equalTo: appTitleLabel.topAnchor, constant: 50),
collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
])
}
override func viewDidLoad() {
super.viewDidLoad()
addSubViews()
}
override func viewDidAppear(_ animated: Bool) {
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.deselectItem(at: indexPath, animated: true)
let selectedImageName = images[indexPath.row]
delegate?.didSelectImage(imageName: selectedImageName)
print("Did tap - \(#function)")
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return images.count
}
func getImageFromCollectionViewImagesFolder(named imageName: String) -> UIImage? {
return UIImage(named: "CollectionView Images/\(imageName)")
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CustomCollectionViewCell.identifier, for: indexPath) as! CustomCollectionViewCell
let image = UIImage(named: images[indexPath.row])
cell.configure(with: image!, name: images[indexPath.row])
return cell
}
}

View file

@ -0,0 +1,408 @@
//
// TestViewController.swift
// Adafruit AR
//
// Created by Trevor Beaton on 4/10/23.
// Copyright © 2023 Vanguard Logic LLC. All rights reserved.
//
import UIKit
import ARKit
protocol PhotosViewControllerDelegate: AnyObject {
func didSelectImage(imageName: String)
}
class BoardScanViewController: UIViewController, ARSCNViewDelegate {
private var sceneView: ARSCNView!
let configuration = ARImageTrackingConfiguration()
private var collectionViewIsPresented: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
sceneView = ARSCNView(frame: view.bounds)
arViewSetup()
initialConfigurationSetup()
addSubViews()
}
@objc func handlePinchGesture(sender: UIPinchGestureRecognizer) {
guard let pointOfView = sceneView.pointOfView else { return }
let cameraNode = pointOfView
cameraNode.isHidden = true
let originalFov = CGFloat(cameraNode.camera!.fieldOfView)
let scale = max(min(sender.scale, 2.0), 0.5)
cameraNode.camera?.fieldOfView = Double(originalFov * scale)
}
override func viewDidAppear(_ animated: Bool) {
presentModal(isPresented: true)
}
func arViewSetup() {
let scene = SCNScene()
// Set the view's delegate
sceneView.delegate = self
sceneView.session.delegate = self as? ARSessionDelegate
sceneView.scene = scene
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchGesture))
sceneView.addGestureRecognizer(pinchGesture)
}
func initialConfigurationSetup() {
let backgroundQueue = DispatchQueue(label: "com.Using_Sequence.configQueue", qos: .default, attributes: .concurrent)
DispatchQueue.main.async {
self.configuration.maximumNumberOfTrackedImages = 1
self.configuration.isAutoFocusEnabled = true
self.configuration.videoHDRAllowed = true
if let hiResFormat = ARWorldTrackingConfiguration.recommendedVideoFormatFor4KResolution {
print("Updated Video Quality")
self.configuration.videoFormat = hiResFormat
}
self.sceneView.session.run(self.configuration, options: [.resetTracking, .removeExistingAnchors])
}
}
func updateConfiguration(withImageName imageName: String) {
print("Searching for... a \(imageName)")
let backgroundQueue = DispatchQueue(label: "com.AdafruitAR.updateConfiguration", qos: .background, attributes: .concurrent)
backgroundQueue.async {
guard let trackedImages = ARReferenceImage.referenceImages(inGroupNamed: "Photos", bundle: Bundle.main) else {
print("No images available")
return
}
// Retrieve UIImage using the imageName
guard let image = UIImage(named: imageName) else {
print("Image not found: \(imageName)")
return
}
// Get the CGImage from the UIImage
guard let imageCG = image.cgImage else {
print("Failed to get CGImage from UIImage")
return
}
let referenceImage = ARReferenceImage(imageCG, orientation: CGImagePropertyOrientation.up, physicalWidth: 0.05) // Replace 0.1 with your image's physical width in meters
referenceImage.name = imageName
self.configuration.trackingImages = [referenceImage]
DispatchQueue.main.async {
self.sceneView.session.run(self.configuration, options: [.resetTracking, .removeExistingAnchors])
}
}
}
func resetARView() {
sceneView.session.run(configuration, options: [.resetTracking,.removeExistingAnchors])
}
func addSubViews() {
// Create the UIActivityIndicatorView
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .medium)
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
// Create the UIStackView
let stackView = UIStackView(arrangedSubviews: [spinner,appTitleLabel])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .horizontal
stackView.alignment = .center
stackView.spacing = 5
// Add subviews
view.addSubview(sceneView)
view.addSubview(homeButton)
view.addSubview(modalPresentButton)
view.addSubview(stackView)
// Constraints
NSLayoutConstraint.activate([
homeButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
homeButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
homeButton.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor),
modalPresentButton.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor, constant: -20),
modalPresentButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20),
stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 90),
stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor), // Center the stack view horizontally
])
}
var spinner: UIActivityIndicatorView = {
let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .medium)
activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false
activityIndicatorView.activityIndicatorViewStyle = .medium
activityIndicatorView.hidesWhenStopped = true
activityIndicatorView.stopAnimating()
return activityIndicatorView
}()
var appTitleLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "SELECT A BOARD BELOW"
label.font = UIFont(name: "AvenirNext-DemiBold", size: 18)
label.textAlignment = .center
return label
}()
let homeButton: UIButton = {
let originalImage = UIImage(systemName: "chevron.backward")
let templateImage = originalImage?.withRenderingMode(.alwaysTemplate)
let newImageSize = CGSize(width: 15, height: 20)
let resizedImage = templateImage?.withTintColor(.white).resizableImage(withCapInsets: .zero, resizingMode: .stretch).withRenderingMode(.alwaysOriginal)
let finalImage = UIGraphicsImageRenderer(size: newImageSize).image { _ in
resizedImage!.draw(in: CGRect(origin: .zero, size: newImageSize))
}
let button = UIButton(type: .custom)
button.setImage(finalImage, for: .normal)
button.setTitleColor(.white, for: .normal)
button.frame.size.height = 100
button.frame.size.width = 100
button.setTitleColor(.white, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
return button
}()
let modalPresentButton: UIButton = {
let image = UIImage(systemName: "arrow.up.circle")?.withTintColor(.white, renderingMode: .alwaysOriginal)
let button = UIButton(type: .custom)
button.setImage(image, for: .normal)
button.setTitleColor(.white, for: .normal)
button.frame.size.height = 200.0
button.frame.size.width = 200.0
button.imageEdgeInsets = UIEdgeInsets(top: 30, left: 30, bottom: 30, right: 30)
button.setTitleColor(.white, for: .normal)
button.addTarget(self, action: #selector(presentCollectionViewModal), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
@objc func presentCollectionViewModal() {
presentModal(isPresented: true)
}
@objc func buttonTapped() {
navigateBack()
// Perform any actions you want when the button is tapped
}
@objc func navigateBack() {
self.dismiss(animated: true, completion: nil)
}
let detailViewController = ARImageCollectionViewController()
private func presentModal(isPresented: Bool) {
print("\(#function) - \(isPresented)")
print("is collectionViewIsPresented?? - \(collectionViewIsPresented)")
let smallId = UISheetPresentationController.Detent.Identifier("small")
let smallDetent = UISheetPresentationController.Detent.custom(identifier: smallId) { context in
return 150
}
// 1
if !collectionViewIsPresented {
detailViewController.modalPresentationStyle = .pageSheet
if let sheet = detailViewController.sheetPresentationController {
// 3
sheet.largestUndimmedDetentIdentifier
sheet.prefersGrabberVisible = true
sheet.preferredCornerRadius = 30.0
sheet.prefersScrollingExpandsWhenScrolledToEdge = false
sheet.detents = [smallDetent,.medium(), .large()]
}
// 4
detailViewController.delegate = self
present(detailViewController, animated: true, completion: nil)
collectionViewIsPresented = true
} else {
collectionViewIsPresented = false
detailViewController.dismiss(animated: true)
}
}
func ARObjectToScene(ARObject: SCNNode, ARScene: SCNScene, planeNode: SCNNode, size: SCNVector3) {
print("Function: \(#function),File: \(#file),Line: \( #line)")
for child in ARScene.rootNode.childNodes {
ARObject.addChildNode(child)
}
ARObject.position = SCNVector3(planeNode.position.x, planeNode.position.y, planeNode.position.z )
ARObject.scale = SCNVector3(x: size.x, y: size.y, z: size.z)
planeNode.addChildNode(ARObject)
}
func ARPlaneAnchor(imageReferenceAnchor: ARImageAnchor, mainNode: SCNNode) {
print("Function: \(#function),File: \(#file),Line: \( #line)")
let plane = SCNPlane(width: imageReferenceAnchor.referenceImage.physicalSize.width, height: imageReferenceAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = UIColor(white: 0.0, alpha: 0.0)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
mainNode.addChildNode(planeNode)
}
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
if let imageAnchor = anchor as? ARImageAnchor {
let backgroundQueue = DispatchQueue(label: "com.Using_Sequence.backgroundQueue", qos: .background, attributes: .concurrent)
backgroundQueue.async {
DispatchQueue.main.async {
self.appTitleLabel.isHidden = true
self.spinner.stopAnimating()
}
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = UIColor(white: 0, alpha: 0)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
node.addChildNode(planeNode)
// Get the reference image's name
guard let imageName = imageAnchor.referenceImage.name else { return }
// Load the AR object's scene based on the image's name
let arObjectScene: SCNScene?
switch imageName {
case "ref.Circuit Playground Bluefruit":
guard let scene = SCNScene(named: "art.scnassets/CircuitPlaygroundBluefruit.scn") else {
print("Failed to load CircuitPlaygroundBluefruit scene")
return
}
arObjectScene = scene
case "ref.Circuit Playground Express":
arObjectScene = SCNScene(named: "art.scnassets/CircuitPlaygroundExpress.scn")!
case "ref.RaspPi Pico W":
arObjectScene = SCNScene(named: "art.scnassets/PiCow.scn")!
case "ref.RaspPi Pico":
arObjectScene = SCNScene(named: "art.scnassets/Pico.scn")!
case "ref.Clue":
arObjectScene = SCNScene(named: "art.scnassets/Clue.scn")!
case "ref.ESP32-S2 TFT":
arObjectScene = SCNScene(named: "art.scnassets/ESP32-S2TFT.scn")!
case "ref.ESP32-S2 Rev TFT":
arObjectScene = SCNScene(named: "art.scnassets/ESP32-S2 Rev TFT.scn")!
case "ref.Teensy 4.1":
arObjectScene = SCNScene(named: "art.scnassets/Teensy4.1.scn")!
default:
return
}
guard let arObjectSceneUnwrapped = arObjectScene else {
print("Failed to load AR object scene")
return
}
// Create an AR object from the loaded scene
let arObject = SCNNode()
let arObjectNodes = arObjectSceneUnwrapped.rootNode.childNodes
for childNode in arObjectNodes {
arObject.addChildNode(childNode)
}
// Set the AR object's position and scale
arObject.position = SCNVector3Zero
arObject.scale = SCNVector3(0.005, 0.005, 0.005) // Set the scale according to your object's size
// Add the AR object to the image's node
DispatchQueue.main.async {
node.addChildNode(arObject)
}
}
}
return node
}
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
print("Function: \(#function),File: \(#file),Line: \( #line)")
guard let imageAnchor = anchor as? ARImageAnchor else { return }
// You can handle the detected images here
let imageName = imageAnchor.referenceImage.name ?? "Unknown image"
print("Image detected: \(imageName)")
// Call the ARPlaneAnchor function to create an AR plane
ARPlaneAnchor(imageReferenceAnchor: imageAnchor, mainNode: node)
}
}
extension BoardScanViewController: PhotosViewControllerDelegate {
func didSelectImage(imageName: String) {
presentModal(isPresented: false)
updateConfiguration(withImageName: "ref.\(imageName)")
DispatchQueue.main.async {
self.appTitleLabel.isHidden = false
self.appTitleLabel.text = ("Scanning for \(imageName)")
self.spinner.startAnimating()
}
print("Selected image: \(imageName)")
}
}

View file

@ -6,47 +6,35 @@
// Copyright © 2018 Vanguard Logic LLC. All rights reserved.
//
import ARKit
import UIKit
class MainViewController: UIViewController, ARSCNViewDelegate {
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
@IBOutlet weak var boardView: ARSCNView!
@IBOutlet weak var qrModeIcon: UIButton!
@IBOutlet weak var qrLabel: UILabel!
@IBOutlet weak var arModeAdabot: UIButton!
@IBOutlet weak var ARLabel: UILabel!
class MainViewController: UIViewController {
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
override func viewDidLoad() {
super.viewDidLoad()
versionString()
}
// MARK: - UI Properties
@IBOutlet weak var arModeAdabot: UIButton!
@IBOutlet weak var versionNumberLabel: UILabel!
@IBOutlet weak var boardScanButton: UIButton!
@IBAction func boardScanButtonPress(_ sender: UIButton) {
navigateToNextViewController()
}
@objc func navigateToNextViewController() {
let nextViewController = BoardScanViewController()
nextViewController.modalPresentationStyle = .fullScreen // or any other presentation style you prefer
self.present(nextViewController, animated: true, completion: nil)
}
func versionString() {
self.versionNumberLabel.text = "v.\(appVersion! as! String)"
}
override func viewDidLoad() {
super.viewDidLoad()
versionString()
let scene = SCNScene()
// Set the view's delegate
boardView.delegate = self
boardView.session.delegate = self as? ARSessionDelegate
boardView.scene = scene
}
}

View file

@ -1,190 +0,0 @@
//
// QRViewController+Video.swift
// Adafruit AR
//
// Created by Trevor B on 4/24/19.
// Copyright © 2019 Vanguard Logic LLC. All rights reserved.
//
import AVFoundation
import SpriteKit
extension QRViewController {
// Video for HalloWing eyeball animation
func halloWingEyeVideo() {
//This is the video for HalloWing's Eye Ball animation
// flip video upside down
playerNode.yScale = -1
playerNode.name = "playerNode"
// create SKScene and set player node on it
spriteKitScene = SKScene(size: CGSize(width: AspectRatio.width + 300, height: AspectRatio.height + 300))
spriteKitScene.scaleMode = .aspectFill
playerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
playerNode.size = spriteKitScene.size
spriteKitScene.addChild(playerNode)
videoPlane.geometry?.firstMaterial?.diffuse.contents = spriteKitScene
videoPlane.geometry?.firstMaterial?.isDoubleSided = true
playerNode.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil)
{ notification in
self.player.seek(to: kCMTimeZero)
self.player.play()
print("reset Video")
}
}
//For Promo Video Playback
func playCrickitVideo() {
crickitPlayer = AVPlayer(url: crickitVideoURL!)
crickitPlayerNode = SKVideoNode(avPlayer: crickitPlayer)
// flip video upside down
crickitPlayerNode.yScale = -1
crickitPlayerNode.name = "CrickitplayerNode"
// create SKScene and set player node on it
spriteKitScene = SKScene(size: CGSize(width: AspectRatio.width + 300, height: AspectRatio.height + 300))
spriteKitScene.scaleMode = .aspectFill
crickitPlayerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
crickitPlayerNode.size = spriteKitScene.size
spriteKitScene.addChild(crickitPlayerNode)
crickitVideo.geometry?.firstMaterial?.diffuse.contents = spriteKitScene
crickitVideo.geometry?.firstMaterial?.isDoubleSided = true
crickitPlayerNode.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: crickitPlayer.currentItem, queue: nil)
{ notification in
self.crickitPlayer.seek(to: kCMTimeZero)
self.crickitPlayer.play()
}
}
func playHallowingVideo() {
halloWingPlayer = AVPlayer(url: hallowingVideoURL!)
halloWingPlayerNode = SKVideoNode(avPlayer: halloWingPlayer)
// flip video upside down
halloWingPlayerNode.yScale = -1
halloWingPlayerNode.name = "HallowingplayerNode"
// create SKScene and set player node on it
spriteKitScene = SKScene(size: CGSize(width: AspectRatio.width + 300, height: AspectRatio.height + 300))
spriteKitScene.scaleMode = .aspectFill
halloWingPlayerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
halloWingPlayerNode.size = spriteKitScene.size
spriteKitScene.addChild(halloWingPlayerNode)
halloWingVideo.geometry?.firstMaterial?.diffuse.contents = spriteKitScene
halloWingVideo.geometry?.firstMaterial?.isDoubleSided = true
halloWingPlayerNode.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: halloWingPlayer.currentItem, queue: nil)
{ notification in
self.halloWingPlayer.seek(to: kCMTimeZero)
self.halloWingPlayer.play()
}
}
func playCPXVideo() {
cpxPlayer = AVPlayer(url: cpxVidURL!)
cpxPlayerNode = SKVideoNode(avPlayer: cpxPlayer)
// flip video upside down
cpxPlayerNode.yScale = -1
cpxPlayerNode.name = "CPXplayerNode"
// create SKScene and set player node on it
spriteKitScene = SKScene(size: CGSize(width: AspectRatio.width + 300, height: AspectRatio.height + 300))
spriteKitScene.scaleMode = .aspectFill
cpxPlayerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
cpxPlayerNode.size = spriteKitScene.size
spriteKitScene.addChild(cpxPlayerNode)
cpxVideo.geometry?.firstMaterial?.diffuse.contents = spriteKitScene
cpxVideo.geometry?.firstMaterial?.isDoubleSided = true
cpxPlayerNode.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: cpxPlayer.currentItem, queue: nil)
{ notification in
self.cpxPlayer.seek(to: kCMTimeZero)
self.cpxPlayer.play()
}
}
func playPyVideo() {
pyPlayer = AVPlayer(url: pyVidURL!)
pyPlayerNode = SKVideoNode(avPlayer: pyPlayer)
// flip video upside down
pyPlayerNode.yScale = -1
pyPlayerNode.name = "PyplayerNode"
// create SKScene and set player node on it
spriteKitScene = SKScene(size: CGSize(width: AspectRatio.width + 300, height: AspectRatio.height + 300))
spriteKitScene.scaleMode = .aspectFill
pyPlayerNode.position = CGPoint(x: spriteKitScene.size.width/2, y: spriteKitScene.size.height/2)
pyPlayerNode.size = spriteKitScene.size
spriteKitScene.addChild(pyPlayerNode)
pyVideo.geometry?.firstMaterial?.diffuse.contents = spriteKitScene
pyVideo.geometry?.firstMaterial?.isDoubleSided = true
pyPlayerNode.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: pyPlayer.currentItem, queue: nil)
{ notification in
self.pyPlayer.seek(to: kCMTimeZero)
self.pyPlayer.play()
}
}
}

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 926 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "Adafruit Circuit Playground Bluefruit pinout copy.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "Circuit Playground Express.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "ref.Clue.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "ESP32-S2 Rev TFT.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "ESP32-S2 TFT.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "RaspPicoW.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "RaspPi Pico.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "Teensy 4.1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

View file

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "Screen Shot 2020-12-22 at 11.33.40 AM.png",
"filename" : "Adafruit Circuit Playground Bluefruit pinout.png",
"idiom" : "universal"
}
],
@ -10,6 +10,7 @@
"version" : 1
},
"properties" : {
"width" : 0.20000000000000001
"unit" : "inches",
"width" : 2
}
}

View file

@ -0,0 +1,16 @@
{
"images" : [
{
"filename" : "Adafruit Reverse TFT Feather ESP32-S2 Pinout.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"unit" : "inches",
"width" : 2
}
}

View file

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "cpx.png",
"filename" : "CLUE pinout.png",
"idiom" : "universal"
}
],
@ -10,6 +10,6 @@
"version" : 1
},
"properties" : {
"width" : 0.20000000000000001
"width" : 0
}
}

Some files were not shown because too many files have changed in this diff Show more