From 6a60a8e79a795522b3eb8af67e8eb70ac35ec438 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:29:54 -0800 Subject: [PATCH 01/10] Created gitignore This is the gitignore file. I copied the text from gitignore.io and then did the terminal work to implement it. If I did anything wrong, please notify me. --- gitignore | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 gitignore diff --git a/gitignore b/gitignore new file mode 100644 index 0000000..ee74ae7 --- /dev/null +++ b/gitignore @@ -0,0 +1,101 @@ +# Created by https://www.toptal.com/developers/gitignore/api/swift,xcode +# Edit at https://www.toptal.com/developers/gitignore?templates=swift,xcode + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +### Xcode ### + +## Xcode 8 and earlier + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/project.xcworkspace/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno +**/xcshareddata/WorkspaceSettings.xcsettings + +# End of https://www.toptal.com/developers/gitignore/api/swift,xcode From 2e31875d5bc7c77e6b2b719782040c9daa9a5ef1 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:31:56 -0800 Subject: [PATCH 02/10] Delete addition --- addition | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 addition diff --git a/addition b/addition deleted file mode 100644 index 3f790c7..0000000 --- a/addition +++ /dev/null @@ -1,9 +0,0 @@ -public class Main { - public static void main(String[] args) { - int sum = 0; - for (int i = 1; i <= 5; i++) { - sum = sum + i; - } - System.out.println(sum); - } -} From abc2cadc719fce72cb91ae0efae8c6360e9f9845 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:33:28 -0800 Subject: [PATCH 03/10] Added sound effect This is the sound effect I'll use. I'm not sure how to implement the sound, since it isn't clear what I'll be using to actually take the picture. Is it clicking the filter or a separate button? --- Shared/mixkit-camera-shutter-click-1133.wav | Bin 0 -> 62562 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Shared/mixkit-camera-shutter-click-1133.wav diff --git a/Shared/mixkit-camera-shutter-click-1133.wav b/Shared/mixkit-camera-shutter-click-1133.wav new file mode 100644 index 0000000000000000000000000000000000000000..697d739e5b6b7e603573bdc74ffe4721c2dc4df0 GIT binary patch literal 62562 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 Date: Thu, 19 Jan 2023 00:35:15 -0800 Subject: [PATCH 04/10] Added height variable This height variable helped the horizontal line filter cover the whole screen. --- Shared/Constants.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Shared/Constants.swift b/Shared/Constants.swift index 6b88142..c971a82 100644 --- a/Shared/Constants.swift +++ b/Shared/Constants.swift @@ -8,8 +8,9 @@ import SwiftUI struct Constant { - static var num = 116 - static var sizeWidthPreview: CGFloat = 150 + static var num: Int = 116 + static var height: Int = 180 + static var sizeWidthPreview: CGFloat = 150 static var minSizeShape: CGFloat = 5 static var borderWidth: CGFloat = 2 } From 3544de4f2823780a37bc0a627918760a061045fa Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:36:58 -0800 Subject: [PATCH 05/10] Added playSound function, horizontal line filter I added the horizontal line filter and a function that plays a sound. However, playSound() doesn't work yet because the TakePictureButton is isolated, and I'm not sure how the picture should be taken. --- Shared/ContentView.swift | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/Shared/ContentView.swift b/Shared/ContentView.swift index 2eddc5f..d637d20 100644 --- a/Shared/ContentView.swift +++ b/Shared/ContentView.swift @@ -9,8 +9,8 @@ import AVFoundation import SwiftUI -var swipePreview = true -var chosenColor = 1.0 +var swipePreview = true; +var chosenColor = 1.0; struct ContentView: View { var body: some View { @@ -29,7 +29,8 @@ struct CameraView: View{ FilterModel(filter: .circle, isPreview: true, color: chosenColor), FilterModel(filter: .rectangle, isPreview: true, color: abs(chosenColor - 1.0)), FilterModel(filter: .lines, isPreview: true, color: abs(chosenColor - 1.0)), - FilterModel(filter: .start, isPreview: true, color: chosenColor) + FilterModel(filter: .start, isPreview: true, color: chosenColor), + FilterModel(filter: .horizontal, isPreview: true, color: abs(chosenColor - 1.0)) ] @StateObject var camera = CameraModel() @StateObject var viewModel = ViewModel() @@ -91,13 +92,14 @@ struct TakePictureButton: View { VStack{ HStack{ if isTaken { - Button(action: {}, label: { - - //todo + Button(action: { + playSound(sound: "mixkit-camera-shutter-click-1133", type: "wav") + }, label: { + }) }else{ Button(action: { - //todo + playSound(sound: "mixkit-camera-shutter-click-1133", type: "wav") }, label: { ZStack{ @@ -200,3 +202,15 @@ struct CameraPreview: UIViewRepresentable { } } + +func playSound(sound: String, type: String) { + var audioPlayer: AVAudioPlayer? + if let path = Bundle.main.path(forResource: sound, ofType: type) { + do { + audioPlayer = try AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: path) as URL) + audioPlayer?.play() + } catch { + print("Could not find and play the sound file.") + } + } +} From 8300d170b23f43e9546650bd70925d0959174b62 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:38:13 -0800 Subject: [PATCH 06/10] Added FHorizontal.swift This file is the horizontal line filter. I'll be done with the other two filters soon. --- Shared/FHorizontal.swift | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Shared/FHorizontal.swift diff --git a/Shared/FHorizontal.swift b/Shared/FHorizontal.swift new file mode 100644 index 0000000..963420c --- /dev/null +++ b/Shared/FHorizontal.swift @@ -0,0 +1,33 @@ +// +// FHorizontal.swift +// MoireLens (iOS) +// +// Created by EJiii on 1/18/23. +// + +import SwiftUI + +struct FHorizontal: View{ + var isPreview = false + var color = 0.0 + var scale: Int + init(isPreview: Bool, color: Double) { + self.isPreview = isPreview + self.scale = isPreview ? 4 : 10 + self.color = color + } + var body: some View{ + GeometryReader { geometry in + VStack{ + ForEach(0.. Date: Thu, 19 Jan 2023 00:39:13 -0800 Subject: [PATCH 07/10] Added the horizontal case This adds the horizontal case to the filters' enumerator and switch. --- Shared/Filter.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Shared/Filter.swift b/Shared/Filter.swift index c6c081d..be63ff3 100644 --- a/Shared/Filter.swift +++ b/Shared/Filter.swift @@ -2,8 +2,8 @@ // Filter.swift // MoireLens (iOS) // -// Created by Delta on 11/7/22 -// Edited by Astra on 1/8/23 +// Created by Delta on 11/7/22. +// Edited by Astra on 1/8/23. // import SwiftUI @@ -13,6 +13,7 @@ enum FILTERS { case circle case start case lines + case horizontal } struct Filter: View { @@ -34,6 +35,8 @@ struct Filter: View { FLines(isPreview: data.isPreview, color: data.color) case .start: FStart(isPreview: data.isPreview, color: data.color) + case .horizontal: + FHorizontal(isPreview: data.isPreview, color: data.color) } }.frame(width: geometry.size.width, height: geometry.size.height, alignment: .center) } From 64ee4e8d46443ece3da58a9222288abd474d07e1 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:42:42 -0800 Subject: [PATCH 08/10] Adjusted the Circle Size This helps the circle filter fit inside the filter scroll and the actual image. I'm not sure if this works on iphone 8 or not, but if it doesn't, I can adjust the parameters. --- Shared/FCircle.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Shared/FCircle.swift b/Shared/FCircle.swift index ea1dabc..ce80ddb 100644 --- a/Shared/FCircle.swift +++ b/Shared/FCircle.swift @@ -15,20 +15,21 @@ struct FCircle: View{ init(isPreview: Bool, color: Double) { self.isPreview = isPreview - self.numShapes = Constant.num / (isPreview ? 3 : 1) + self.numShapes = Constant.num / (isPreview ? 2 : 1) self.color = color } var body: some View{ ZStack(alignment: .center){ - ForEach(Array(stride(from: 0, to: numShapes, by: 4)), id: \.self) { i in + ForEach(Array(stride(from: 0, to: numShapes, by: 5)), id: \.self) { i in Circle() .stroke(Color(white: color), lineWidth: Constant.borderWidth) .frame( - width: Constant.minSizeShape + (CGFloat(i) * 4), - height: Constant.minSizeShape + (CGFloat(i) * 4), + width: Constant.minSizeShape + (CGFloat(i) * (isPreview ? 2 : 3)) + (isPreview ? 20 : 0), + height: Constant.minSizeShape + (CGFloat(i) * (isPreview ? 2 : 3)) + (isPreview ? 20 : 0), alignment: .center) } } } } + From 2180752d4aceca7301e283fd8467f57c66bae659 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:47:28 -0800 Subject: [PATCH 09/10] Adjusted the Rectangle Size This helps the rectangle filter fit inside the filter scroll and the actual image. I'm not sure if this works on iphone 8 or not, but if it doesn't, I can adjust the parameters. --- Shared/FReactangle.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Shared/FReactangle.swift b/Shared/FReactangle.swift index 24caf23..1ea9220 100644 --- a/Shared/FReactangle.swift +++ b/Shared/FReactangle.swift @@ -25,10 +25,11 @@ struct FReactngle: View{ Rectangle() .stroke(Color(white: color), lineWidth: Constant.borderWidth) .frame( - width: Constant.minSizeShape + (CGFloat(i) * 4), - height: Constant.minSizeShape + (CGFloat(i) * 4), + width: Constant.minSizeShape + (CGFloat(i) * 3), + height: Constant.minSizeShape + (CGFloat(i) * 3), alignment: .center) } } } } + From 91792d54dfe5041e47af41e2dc6d2f245c2adee2 Mon Sep 17 00:00:00 2001 From: Ernest Ibarolle <63222761+AdAstraCA@users.noreply.github.com> Date: Fri, 27 Jan 2023 01:44:05 -0800 Subject: [PATCH 10/10] Added camera functionality I added code that can help the app take photos. However, it can be a bit inconsistent, which I think is because of how the code is formatted. However, I can debug that later, since now that the camera is done, I will focus on the Arduino issues. --- Shared/ContentView.swift | 157 +++++++++++++++++++++++++++------------ 1 file changed, 111 insertions(+), 46 deletions(-) diff --git a/Shared/ContentView.swift b/Shared/ContentView.swift index d637d20..e49d80c 100644 --- a/Shared/ContentView.swift +++ b/Shared/ContentView.swift @@ -3,7 +3,7 @@ // Shared // // Created by Delta on 24/5/22. -// Edited by Astra on 1/8/23. +// Edited by Astra on 1/27/23. // import AVFoundation @@ -48,7 +48,57 @@ struct CameraView: View{ } }.onAppear { camera.Check() - }.frame(width: geometry.size.width, height: geometry.size.height / 1.4, alignment: .center).clipped() + }.frame(width: geometry.size.width, height: geometry.size.height / 1.6, alignment: .center).clipped() + HStack{ + + // if taken showing save and again take button... + + if camera.isTaken{ + Spacer() + + Button(action: camera.reTake, label: { + + Image(systemName: "arrow.triangle.2.circlepath.camera") + .foregroundColor(.black) + .padding() + .background(Color.white) + .clipShape(Circle()) + }) + .padding(.trailing,10) + + Spacer() + + Button(action: {if !camera.isSaved{camera.savePic()}}, label: { + Text(camera.isSaved ? "Saved" : "Save") + .foregroundColor(.black) + .fontWeight(.semibold) + .padding(.vertical,10) + .padding(.horizontal,20) + .background(Color.white) + .clipShape(Capsule()) + }) + .padding(.leading) + + Spacer() + } + else{ + + Button(action: camera.takePic, label: { + + ZStack{ + + Circle() + .fill(Color.white) + .frame(width: 65, height: 65) + + Circle() + .stroke(Color.white,lineWidth: 2) + .frame(width: 75, height: 75) + } + }) + } + } + .frame(height: 75) ScrollView(.horizontal, showsIndicators: false) { HStack { ForEach(filtersPreview,id: \.filter) { filterPreview in @@ -86,45 +136,16 @@ struct CameraView: View{ } } -struct TakePictureButton: View { - var isTaken: Bool - var body: some View { - VStack{ - HStack{ - if isTaken { - Button(action: { - playSound(sound: "mixkit-camera-shutter-click-1133", type: "wav") - }, label: { - - }) - }else{ - Button(action: { - playSound(sound: "mixkit-camera-shutter-click-1133", type: "wav") - }, label: - { - ZStack{ - Circle() - .fill(Color.white) - .frame(width: 65, height: 65, alignment: .center) - Circle() - .stroke(Color.white, lineWidth: 2) - .frame(width: 75, height: 75, alignment: .center) - } - }) - } - } - } - } -} - //camera model -class CameraModel: ObservableObject{ +class CameraModel: NSObject, ObservableObject, AVCapturePhotoCaptureDelegate{ @Published var isTaken = false @Published var session = AVCaptureSession() @Published var alert = false + @Published var isSaved = false @Published var output = AVCapturePhotoOutput() @Published var preview: AVCaptureVideoPreviewLayer! + @Published var picData = Data(count: 0) func Check(){ switch AVCaptureDevice.authorizationStatus(for: .video){ @@ -175,6 +196,62 @@ class CameraModel: ObservableObject{ print(error.localizedDescription) } } + + //take and retake photos + + func takePic(){ + + self.output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self) + + DispatchQueue.global(qos: .background).async { + + self.session.stopRunning() + + DispatchQueue.main.async { + withAnimation{self.isTaken.toggle()} + } + } + } + + func reTake(){ + + DispatchQueue.global(qos: .background).async { + + self.session.startRunning() + + DispatchQueue.main.async { + withAnimation{self.isTaken.toggle()} + //clearing ... + self.isSaved = false + self.picData = Data(count: 0) + } + } + } + + func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { + + if error != nil{ + return + } + + print("pic taken...") + + guard let imageData = photo.fileDataRepresentation() else{return} + + self.picData = imageData + } + + func savePic(){ + + guard let image = UIImage(data: self.picData) else{return} + + // saving Image... + UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) + + self.isSaved = true + + print("saved Successfully....") + } } // setting view for preview @@ -202,15 +279,3 @@ struct CameraPreview: UIViewRepresentable { } } - -func playSound(sound: String, type: String) { - var audioPlayer: AVAudioPlayer? - if let path = Bundle.main.path(forResource: sound, ofType: type) { - do { - audioPlayer = try AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: path) as URL) - audioPlayer?.play() - } catch { - print("Could not find and play the sound file.") - } - } -}