Compare commits
7 commits
master
...
QR-code-Fe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5a53feb55 | ||
|
|
5df613021f | ||
|
|
3f3cfd3882 | ||
|
|
a148916f95 | ||
|
|
6fac5e3acd | ||
|
|
9ecab5dc4c | ||
|
|
c710222af6 |
BIN
.DS_Store
vendored
|
|
@ -7,24 +7,15 @@
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* 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 */; };
|
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 */; };
|
29897A482569E8330080F4BF /* ARScenes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29897A472569E8330080F4BF /* ARScenes.swift */; };
|
||||||
29897A58256CA76F0080F4BF /* ARWorldAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29897A57256CA76F0080F4BF /* ARWorldAnchor.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 */; };
|
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 */; };
|
29D096292559C71D0032654B /* ClickableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D096282559C71D0032654B /* ClickableView.swift */; };
|
||||||
D515BADA21FF5826001E7079 /* Highlight SCNNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D515BAD921FF5826001E7079 /* Highlight SCNNode.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 */; };
|
D54801CE217E12E700170412 /* hallowing_eye.mov in Resources */ = {isa = PBXBuildFile; fileRef = D54801CB217E118B00170412 /* hallowing_eye.mov */; };
|
||||||
D54E995B20E155DF0021A2E5 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54E995A20E155DF0021A2E5 /* Extensions.swift */; };
|
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 */; };
|
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 */; };
|
D55F683020BF2CA4005219D9 /* FocusSquare.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55F682E20BF2CA3005219D9 /* FocusSquare.swift */; };
|
||||||
D55F683120BF2CA4005219D9 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55F682F20BF2CA4005219D9 /* Utilities.swift */; };
|
D55F683120BF2CA4005219D9 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55F682F20BF2CA4005219D9 /* Utilities.swift */; };
|
||||||
D56ED486213EE255000E62F0 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D56ED485213EE255000E62F0 /* MainViewController.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 */; };
|
D583C69D215BF2DB00256EB1 /* pageThree.swift in Sources */ = {isa = PBXBuildFile; fileRef = D583C69C215BF2DB00256EB1 /* pageThree.swift */; };
|
||||||
D58A102C20FE6C39003B0E93 /* ViewController+Nodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58A102B20FE6C39003B0E93 /* ViewController+Nodes.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 */; };
|
D5ABE2912146BB2A00AB8237 /* RootPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */; };
|
||||||
|
|
@ -59,24 +49,15 @@
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference 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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootPageViewController.swift; sourceTree = "<group>"; };
|
||||||
|
|
@ -110,16 +90,6 @@
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup 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 */ = {
|
291E63DA227C8E9800F77AB5 /* Resources */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
@ -137,30 +107,23 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
D56ED485213EE255000E62F0 /* MainViewController.swift */,
|
D56ED485213EE255000E62F0 /* MainViewController.swift */,
|
||||||
|
D53B29AB29E440B000F68A06 /* BoardScanViewController.swift */,
|
||||||
|
D53B29AF29E4503E00F68A06 /* ARImageCollectionViewController.swift */,
|
||||||
|
D53B29AD29E44FBD00F68A06 /* ARImageCollectionViewCell.swift */,
|
||||||
D583C69C215BF2DB00256EB1 /* pageThree.swift */,
|
D583C69C215BF2DB00256EB1 /* pageThree.swift */,
|
||||||
D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */,
|
D5ABE2902146BB2A00AB8237 /* RootPageViewController.swift */,
|
||||||
);
|
);
|
||||||
path = Pages;
|
path = Pages;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
29F7FDE62295B25600F15B0E /* Board Scan View Controller */ = {
|
29F7FDE62295B25600F15B0E /* Board Scan */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
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 */,
|
2948B61925E6D82D0013781D /* CircleLabel.swift */,
|
||||||
29546B5A2585B51000002715 /* BoardViewController+HostingController.swift */,
|
|
||||||
29AA121C25A9717E0037003B /* ListOfTexts.swift */,
|
29AA121C25A9717E0037003B /* ListOfTexts.swift */,
|
||||||
29897A472569E8330080F4BF /* ARScenes.swift */,
|
29897A472569E8330080F4BF /* ARScenes.swift */,
|
||||||
29B109C822933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift */,
|
|
||||||
);
|
);
|
||||||
path = "Board Scan View Controller";
|
path = "Board Scan";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
D53C6F1C20D2D1A70051A030 /* Frameworks */ = {
|
D53C6F1C20D2D1A70051A030 /* Frameworks */ = {
|
||||||
|
|
@ -208,8 +171,7 @@
|
||||||
D55B075C20FF934B0066976C /* ViewController+Audio.swift */,
|
D55B075C20FF934B0066976C /* ViewController+Audio.swift */,
|
||||||
D55B075A20FF8DD40066976C /* ViewController+Gesture Recognizers.swift */,
|
D55B075A20FF8DD40066976C /* ViewController+Gesture Recognizers.swift */,
|
||||||
29D096282559C71D0032654B /* ClickableView.swift */,
|
29D096282559C71D0032654B /* ClickableView.swift */,
|
||||||
29F7FDE62295B25600F15B0E /* Board Scan View Controller */,
|
29F7FDE62295B25600F15B0E /* Board Scan */,
|
||||||
291E63D9227C6E0E00F77AB5 /* QR Code View Controller */,
|
|
||||||
291E63DA227C8E9800F77AB5 /* Resources */,
|
291E63DA227C8E9800F77AB5 /* Resources */,
|
||||||
291E63DB227CA33700F77AB5 /* Pages */,
|
291E63DB227CA33700F77AB5 /* Pages */,
|
||||||
D5F2F4E3208E190D00B0790B /* art.scnassets */,
|
D5F2F4E3208E190D00B0790B /* art.scnassets */,
|
||||||
|
|
@ -318,7 +280,6 @@
|
||||||
files = (
|
files = (
|
||||||
D54E995B20E155DF0021A2E5 /* Extensions.swift in Sources */,
|
D54E995B20E155DF0021A2E5 /* Extensions.swift in Sources */,
|
||||||
29AA121D25A9717E0037003B /* ListOfTexts.swift in Sources */,
|
29AA121D25A9717E0037003B /* ListOfTexts.swift in Sources */,
|
||||||
297574E025A612E4001991E7 /* SwiftUITarotCardView.swift in Sources */,
|
|
||||||
D5F2F4E6208E190D00B0790B /* ViewController.swift in Sources */,
|
D5F2F4E6208E190D00B0790B /* ViewController.swift in Sources */,
|
||||||
D55F683020BF2CA4005219D9 /* FocusSquare.swift in Sources */,
|
D55F683020BF2CA4005219D9 /* FocusSquare.swift in Sources */,
|
||||||
D5ABE2912146BB2A00AB8237 /* RootPageViewController.swift in Sources */,
|
D5ABE2912146BB2A00AB8237 /* RootPageViewController.swift in Sources */,
|
||||||
|
|
@ -326,27 +287,18 @@
|
||||||
D55B075D20FF934B0066976C /* ViewController+Audio.swift in Sources */,
|
D55B075D20FF934B0066976C /* ViewController+Audio.swift in Sources */,
|
||||||
D583C69D215BF2DB00256EB1 /* pageThree.swift in Sources */,
|
D583C69D215BF2DB00256EB1 /* pageThree.swift in Sources */,
|
||||||
D55B076120FF99230066976C /* WorldPosition.swift in Sources */,
|
D55B076120FF99230066976C /* WorldPosition.swift in Sources */,
|
||||||
298FD3F62270B4D9007E2F4C /* QRViewController+GestureRec.swift in Sources */,
|
|
||||||
29D096292559C71D0032654B /* ClickableView.swift in Sources */,
|
29D096292559C71D0032654B /* ClickableView.swift in Sources */,
|
||||||
29897A58256CA76F0080F4BF /* ARWorldAnchor.swift in Sources */,
|
29897A58256CA76F0080F4BF /* ARWorldAnchor.swift in Sources */,
|
||||||
|
D53B29AC29E440B000F68A06 /* BoardScanViewController.swift in Sources */,
|
||||||
D515BADA21FF5826001E7079 /* Highlight SCNNode.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 */,
|
2948B61A25E6D82D0013781D /* CircleLabel.swift in Sources */,
|
||||||
D56ED488213EEC94000E62F0 /* QRViewController.swift in Sources */,
|
|
||||||
D55B075B20FF8DD40066976C /* ViewController+Gesture Recognizers.swift in Sources */,
|
D55B075B20FF8DD40066976C /* ViewController+Gesture Recognizers.swift in Sources */,
|
||||||
290439F02292E34200979BAD /* BoardViewController.swift in Sources */,
|
D53B29B029E4503E00F68A06 /* ARImageCollectionViewController.swift in Sources */,
|
||||||
29546B5B2585B51000002715 /* BoardViewController+HostingController.swift in Sources */,
|
|
||||||
298FD3F82270B7A5007E2F4C /* QRViewController+Video.swift in Sources */,
|
|
||||||
295049AE25E69AB0003E7484 /* BLMBoardOverlay.swift in Sources */,
|
|
||||||
D55F683120BF2CA4005219D9 /* Utilities.swift in Sources */,
|
D55F683120BF2CA4005219D9 /* Utilities.swift in Sources */,
|
||||||
D5F2F4E2208E190D00B0790B /* AppDelegate.swift in Sources */,
|
D5F2F4E2208E190D00B0790B /* AppDelegate.swift in Sources */,
|
||||||
D58A102C20FE6C39003B0E93 /* ViewController+Nodes.swift in Sources */,
|
D58A102C20FE6C39003B0E93 /* ViewController+Nodes.swift in Sources */,
|
||||||
293EC85925E8092C008EB6CA /* Teensy41BoardOverlay.swift in Sources */,
|
D53B29AE29E44FBD00F68A06 /* ARImageCollectionViewCell.swift in Sources */,
|
||||||
29B109C922933CE9004D6D58 /* BoardViewController+Gesture Recognizers.swift in Sources */,
|
|
||||||
D56ED486213EE255000E62F0 /* MainViewController.swift in Sources */,
|
D56ED486213EE255000E62F0 /* MainViewController.swift in Sources */,
|
||||||
2917003925858C3900E39853 /* BoardViewController+Audio.swift in Sources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -423,7 +375,7 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
|
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
|
|
@ -477,7 +429,7 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
|
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||||
|
|
@ -490,16 +442,16 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 4;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = 2X94RM7457;
|
DEVELOPMENT_TEAM = 2X94RM7457;
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Frameworks",
|
"$(PROJECT_DIR)/Frameworks",
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
|
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 1.12;
|
MARKETING_VERSION = 1.14;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.adafruit.adafruit-AR";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.adafruit.adafruit-AR";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 4.0;
|
SWIFT_VERSION = 4.0;
|
||||||
|
|
@ -512,16 +464,16 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 4;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_TEAM = 2X94RM7457;
|
DEVELOPMENT_TEAM = 2X94RM7457;
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Frameworks",
|
"$(PROJECT_DIR)/Frameworks",
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/Info.plist";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
|
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 1.12;
|
MARKETING_VERSION = 1.14;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.adafruit.adafruit-AR";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.adafruit.adafruit-AR";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 4.0;
|
SWIFT_VERSION = 4.0;
|
||||||
|
|
|
||||||
BIN
Adafruit AR/.DS_Store
vendored
|
|
@ -1,267 +1,12 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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"/>
|
<device id="ipad11_0rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
|
||||||
<dependencies>
|
<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="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<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-->
|
<!--Onboarding p1-->
|
||||||
<scene sceneID="sWd-JV-Aqa">
|
<scene sceneID="sWd-JV-Aqa">
|
||||||
<objects>
|
<objects>
|
||||||
|
|
@ -279,7 +24,7 @@ Works with:
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Adabot-Mode-icon-512px" translatesAutoresizingMaskIntoConstraints="NO" id="3Pr-7B-Svr">
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||||
</imageView>
|
</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">
|
<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"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</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">
|
<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="36" y="925" width="760" height="68"/>
|
<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"/>
|
<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="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"/>
|
<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"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="test1" translatesAutoresizingMaskIntoConstraints="NO" id="5i7-wJ-8X2" userLabel="Adabot">
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="adabot" translatesAutoresizingMaskIntoConstraints="NO" id="fSX-bs-tx0">
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
</imageView>
|
</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">
|
<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"/>
|
<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="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<string key="text">Meet Adabot, your personal robot assistant!
|
<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"/>
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="cpx1" translatesAutoresizingMaskIntoConstraints="NO" id="e4O-gF-k4I" userLabel="Adabot">
|
<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="80" y="256" width="667" height="441"/>
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||||
</imageView>
|
</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">
|
<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"/>
|
<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="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, & more! </string>
|
<string key="text">In Board Info mode, view your own real Adafruit board with an AR overlay describing important details - chips, components, & 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"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleAspectFit" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hxB-7h-VYD">
|
<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"/>
|
<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"/>
|
<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"/>
|
<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>
|
</connections>
|
||||||
</button>
|
</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">
|
<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"/>
|
<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="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>
|
<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"/>
|
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||||
</textView>
|
</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">
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||||
</imageView>
|
</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">
|
<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"/>
|
<rect key="frame" x="0.0" y="0.0" width="834" height="1194"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<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">
|
<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"/>
|
<rect key="frame" x="379.5" y="52" width="75" height="20"/>
|
||||||
<constraints>
|
<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"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</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">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="rzH-3l-atp">
|
||||||
<rect key="frame" x="327" y="585.5" width="180" height="28"/>
|
<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>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="180" id="YDO-Dj-dEZ"/>
|
<constraint firstAttribute="height" constant="225" id="pNO-qL-tXF"/>
|
||||||
</constraints>
|
<constraint firstAttribute="width" constant="225" id="wCF-1t-H4X"/>
|
||||||
<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>
|
</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"/>
|
<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"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="71S-tN-o8i" userLabel="Board Icon">
|
<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"/>
|
<rect key="frame" x="0.0" y="282.5" width="225" height="225"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" secondItem="71S-tN-o8i" secondAttribute="height" multiplier="1:1" id="Rge-Dd-gQ4"/>
|
<constraint firstAttribute="height" constant="225" id="Uwb-gh-0Ie"/>
|
||||||
|
<constraint firstAttribute="width" constant="225" id="iAu-WF-5DK"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<state key="normal" title="Button" image="Circuit_Playground1-mask2"/>
|
<state key="normal" image="Circuit_Playground1-mask2"/>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="vvW-nO-QUQ" kind="presentation" identifier="" modalPresentationStyle="fullScreen" modalTransitionStyle="crossDissolve" id="Ekl-WB-CCK"/>
|
<action selector="boardScanButtonPress:" destination="TV4-si-PBW" eventType="touchUpInside" id="nAb-l9-NKy"/>
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</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">
|
<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="327" y="853.5" width="180" height="27.5"/>
|
<rect key="frame" x="0.0" y="522.5" width="225" 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"/>
|
<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"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NU1-NZ-3YS" userLabel="QR Icon">
|
</subviews>
|
||||||
<rect key="frame" x="317.5" y="646.5" width="199" height="199"/>
|
</stackView>
|
||||||
<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>
|
|
||||||
</subviews>
|
</subviews>
|
||||||
<viewLayoutGuide key="safeArea" id="AW5-us-1F3"/>
|
<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"/>
|
<color key="backgroundColor" red="0.15781691670417786" green="0.67801815271377563" blue="0.93185180425643921" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<constraints>
|
<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="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="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="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="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="rzH-3l-atp" firstAttribute="top" secondItem="Xf5-5J-Hvr" secondAttribute="bottom" constant="28" id="y7g-1g-yzk"/>
|
||||||
<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"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<navigationItem key="navigationItem" id="BHS-Qm-M7o"/>
|
<navigationItem key="navigationItem" id="BHS-Qm-M7o"/>
|
||||||
<connections>
|
<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="arModeAdabot" destination="i4v-di-Acz" id="imG-wo-zZB"/>
|
||||||
<outlet property="boardView" destination="n9p-8U-ZtN" id="Es2-lW-ANW"/>
|
<outlet property="boardScanButton" destination="71S-tN-o8i" id="hzb-rF-lPa"/>
|
||||||
<outlet property="qrLabel" destination="JoM-op-FvU" id="qq2-gj-fB0"/>
|
|
||||||
<outlet property="qrModeIcon" destination="NU1-NZ-3YS" id="2Bc-I2-dkp"/>
|
|
||||||
<outlet property="versionNumberLabel" destination="Xf5-5J-Hvr" id="YkT-bR-DRp"/>
|
<outlet property="versionNumberLabel" destination="Xf5-5J-Hvr" id="YkT-bR-DRp"/>
|
||||||
</connections>
|
</connections>
|
||||||
</viewController>
|
</viewController>
|
||||||
|
|
@ -629,12 +336,119 @@ Hit the Letters icon to reveal letters that will play videos from Circuit Playgr
|
||||||
<!--Adabot Mode-->
|
<!--Adabot Mode-->
|
||||||
<scene sceneID="tXr-a1-R10">
|
<scene sceneID="tXr-a1-R10">
|
||||||
<objects>
|
<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">
|
<view contentMode="scaleToFill" id="rfW-ZP-ZId">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="689" height="391"/>
|
<rect key="frame" x="0.0" y="0.0" width="689" height="391"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x0S-5Z-H4u">
|
<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"/>
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||||
<state key="normal" title="Done">
|
<state key="normal" title="Done">
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<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"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<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">
|
<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"/>
|
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="11"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</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">
|
<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"/>
|
<fontDescription key="fontDescription" name="AvenirNext-Medium" family="Avenir Next" pointSize="12"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</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">
|
<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"/>
|
<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"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0JT-x0-hGz">
|
<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"/>
|
<fontDescription key="fontDescription" name="AvenirNext-DemiBold" family="Avenir Next" pointSize="20"/>
|
||||||
<state key="normal" title="Done">
|
<state key="normal" title="Done">
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<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>
|
</userDefinedRuntimeAttributes>
|
||||||
</view>
|
</view>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="SZV-WD-TEh" sceneMemberID="firstResponder"/>
|
<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>
|
</objects>
|
||||||
<point key="canvasLocation" x="2168.8000000000002" y="-2183.497536945813"/>
|
<point key="canvasLocation" x="2241.7266187050363" y="-1304.0201005025126"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<inferredMetricsTieBreakers>
|
<inferredMetricsTieBreakers>
|
||||||
<segue reference="lDk-c2-68K"/>
|
<segue reference="dpc-io-64V"/>
|
||||||
</inferredMetricsTieBreakers>
|
</inferredMetricsTieBreakers>
|
||||||
<resources>
|
<resources>
|
||||||
<image name="?mark_icon" width="64" height="64"/>
|
<image name="?mark_icon" width="64" height="64"/>
|
||||||
<image name="Adabot-Mode-icon-512px" width="512" height="512"/>
|
<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="Circuit_Playground1-mask2" width="512" height="512"/>
|
||||||
<image name="HomeIcon" width="512" height="512"/>
|
<image name="HomeIcon" width="512" height="512"/>
|
||||||
<image name="QR-Mode-icon-512px" width="512" height="512"/>
|
<image name="QR-Mode-icon-512px" width="512" height="512"/>
|
||||||
|
|
@ -2620,7 +2339,6 @@ AAGH/wABiAQAAYgKAAGIEgABiBQAAYgWAAGIGAABiBoAAZm6AAGZvwABmcwAAZnPAAGZ3AABmeEAAZnp
|
||||||
AAGZ7AABmfEAAZn5AAAAAAAABAEAAAAAAAAAaAAAAAAAAAAAAAAAAAABmfw
|
AAGZ7AABmfEAAZn5AAAAAAAABAEAAAAAAAAAaAAAAAAAAAAAAAAAAAABmfw
|
||||||
</mutableData>
|
</mutableData>
|
||||||
</image>
|
</image>
|
||||||
<image name="cpx1" width="1218" height="1178"/>
|
|
||||||
<image name="imageView:wo0-AE-5XX:image" width="230" height="93">
|
<image name="imageView:wo0-AE-5XX:image" width="230" height="93">
|
||||||
<mutableData key="keyedArchiveRepresentation">
|
<mutableData key="keyedArchiveRepresentation">
|
||||||
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T
|
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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: [""])
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -14,7 +14,7 @@ struct ARScenes {
|
||||||
static let minervaScene = SCNScene(named: "art.scnassets/Minerva.scn")!
|
static let minervaScene = SCNScene(named: "art.scnassets/Minerva.scn")!
|
||||||
|
|
||||||
static let circuitPlaygroundLabelScene = SCNScene(named: "art.scnassets/CPX_Displays.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
|
//MARK:- Tarot Cards
|
||||||
|
|
||||||
50
Adafruit AR/Pages/ARImageCollectionViewCell.swift
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
95
Adafruit AR/Pages/ARImageCollectionViewController.swift
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
408
Adafruit AR/Pages/BoardScanViewController.swift
Normal 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)")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6,47 +6,35 @@
|
||||||
// Copyright © 2018 Vanguard Logic LLC. All rights reserved.
|
// Copyright © 2018 Vanguard Logic LLC. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
import ARKit
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
|
class MainViewController: UIViewController {
|
||||||
|
|
||||||
class MainViewController: UIViewController, ARSCNViewDelegate {
|
|
||||||
|
|
||||||
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
|
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
versionString()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - UI Properties
|
||||||
@IBOutlet weak var boardView: ARSCNView!
|
|
||||||
|
|
||||||
@IBOutlet weak var qrModeIcon: UIButton!
|
|
||||||
|
|
||||||
@IBOutlet weak var qrLabel: UILabel!
|
|
||||||
|
|
||||||
@IBOutlet weak var arModeAdabot: UIButton!
|
@IBOutlet weak var arModeAdabot: UIButton!
|
||||||
|
|
||||||
@IBOutlet weak var ARLabel: UILabel!
|
|
||||||
|
|
||||||
@IBOutlet weak var versionNumberLabel: UILabel!
|
@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() {
|
func versionString() {
|
||||||
self.versionNumberLabel.text = "v.\(appVersion! as! String)"
|
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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
After Width: | Height: | Size: 237 KiB |
BIN
Adafruit AR/art.scnassets/.DS_Store
vendored
|
After Width: | Height: | Size: 151 KiB |
BIN
Adafruit AR/art.scnassets/CLUE pinout.png
Normal file
|
After Width: | Height: | Size: 163 KiB |
BIN
Adafruit AR/art.scnassets/CPX-Pinouts.png
Normal file
|
After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 136 KiB |
BIN
Adafruit AR/art.scnassets/CircuitPlaygroundBluefruit.scn
Normal file
BIN
Adafruit AR/art.scnassets/CircuitPlaygroundExpress.scn
Normal file
BIN
Adafruit AR/art.scnassets/Clue.scn
Normal file
|
Before Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 116 KiB |
BIN
Adafruit AR/art.scnassets/ESP32-S2 Rev TFT.scn
Normal file
BIN
Adafruit AR/art.scnassets/ESP32-S2 TFT Feather Pinout.png
Normal file
|
After Width: | Height: | Size: 352 KiB |
BIN
Adafruit AR/art.scnassets/ESP32-S2TFT.scn
Normal file
|
Before Width: | Height: | Size: 108 KiB |
BIN
Adafruit AR/art.scnassets/PiCow.scn
Normal file
BIN
Adafruit AR/art.scnassets/Pico.scn
Normal file
BIN
Adafruit AR/art.scnassets/PicoPinout.png
Normal file
|
After Width: | Height: | Size: 926 KiB |
BIN
Adafruit AR/art.scnassets/PicoW.png
Normal file
|
After Width: | Height: | Size: 343 KiB |
|
Before Width: | Height: | Size: 88 KiB |
BIN
Adafruit AR/art.scnassets/Teensy4.1.scn
Normal file
BIN
Adafruit AR/art.scnassets/TestPlane.scn
Normal file
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 84 KiB |
BIN
Adafruit AR/art.scnassets/teensy-4.1-pinout.png
Normal file
|
After Width: | Height: | Size: 219 KiB |
BIN
Assets.xcassets/.DS_Store
vendored
BIN
Assets.xcassets/CollectionView Images/.DS_Store
vendored
Normal file
|
After Width: | Height: | Size: 373 KiB |
21
Assets.xcassets/CollectionView Images/Circuit Playground Bluefruit.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 460 KiB |
21
Assets.xcassets/CollectionView Images/Circuit Playground Express.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
21
Assets.xcassets/CollectionView Images/Clue.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Assets.xcassets/CollectionView Images/Clue.imageset/ref.Clue.png
vendored
Normal file
|
After Width: | Height: | Size: 90 KiB |
6
Assets.xcassets/CollectionView Images/Contents.json
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
21
Assets.xcassets/CollectionView Images/ESP32-S2 Rev TFT.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Assets.xcassets/CollectionView Images/ESP32-S2 Rev TFT.imageset/ESP32-S2 Rev TFT.png
vendored
Normal file
|
After Width: | Height: | Size: 71 KiB |
21
Assets.xcassets/CollectionView Images/ESP32-S2 TFT.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Assets.xcassets/CollectionView Images/ESP32-S2 TFT.imageset/ESP32-S2 TFT.png
vendored
Normal file
|
After Width: | Height: | Size: 94 KiB |
21
Assets.xcassets/CollectionView Images/RaspPi Pico W.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Assets.xcassets/CollectionView Images/RaspPi Pico W.imageset/RaspPicoW.png
vendored
Normal file
|
After Width: | Height: | Size: 80 KiB |
21
Assets.xcassets/CollectionView Images/RaspPi Pico.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Assets.xcassets/CollectionView Images/RaspPi Pico.imageset/RaspPi Pico.png
vendored
Normal file
|
After Width: | Height: | Size: 99 KiB |
21
Assets.xcassets/CollectionView Images/Teensy 4.1.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Assets.xcassets/CollectionView Images/Teensy 4.1.imageset/Teensy 4.1.png
vendored
Normal file
|
After Width: | Height: | Size: 267 KiB |
BIN
Assets.xcassets/Photos.arresourcegroup/.DS_Store
vendored
Normal file
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "Screen Shot 2020-12-22 at 11.33.40 AM.png",
|
"filename" : "Adafruit Circuit Playground Bluefruit pinout.png",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
"version" : 1
|
"version" : 1
|
||||||
},
|
},
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"width" : 0.20000000000000001
|
"unit" : "inches",
|
||||||
|
"width" : 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
After Width: | Height: | Size: 237 KiB |
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "cpx.png",
|
"filename" : "CLUE pinout.png",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -10,6 +10,6 @@
|
||||||
"version" : 1
|
"version" : 1
|
||||||
},
|
},
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"width" : 0.20000000000000001
|
"width" : 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||