@@ -37,7 +37,7 @@ enum ViewState: Equatable {
3737}
3838
3939struct QuickPoseBasicView : View {
40- private var quickPose = QuickPose ( sdkKey: " YOUR SDK KEY " ) // register for your free key at https://dev.quickpose.ai
40+ private var quickPose = QuickPose ( sdkKey: " YOUR SDK KEY HERE " ) // register for your free key at https://dev.quickpose.ai
4141 @EnvironmentObject var viewModel : ViewModel
4242 @EnvironmentObject var sessionConfig : SessionConfig
4343
@@ -182,78 +182,80 @@ struct QuickPoseBasicView: View {
182182 }
183183 . onAppear ( ) {
184184 UIApplication . shared. isIdleTimerDisabled = true
185- quickPose. start ( features: sessionConfig. exercise. features, onFrame: { status, image, features, feedback, landmarks in
186- overlayImage = image
187- if case . success( _, _) = status {
188-
189- switch state {
190- case . introBoundingBox:
185+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 1.0 ) {
186+ quickPose. start ( features: sessionConfig. exercise. features, onFrame: { status, image, features, feedback, landmarks in
187+ overlayImage = image
188+ if case . success = status {
191189
192- if let landmarks = landmarks, canMoveFromBoundingBox ( landmarks: landmarks) {
193- state = . boundingBox( enterTime: Date ( ) )
194- boundingBoxMaskWidth = 0
195- }
196- case . boundingBox( let enterDate) :
197- if let landmarks = landmarks, canMoveFromBoundingBox ( landmarks: landmarks) {
198- let timeSinceInsideBBox = - enterDate. timeIntervalSinceNow
199- boundingBoxMaskWidth = timeSinceInsideBBox / 2
200- if timeSinceInsideBBox > 2 {
201- state = . introExercise( sessionConfig. exercise)
190+ switch state {
191+ case . introBoundingBox:
192+
193+ if let landmarks = landmarks, canMoveFromBoundingBox ( landmarks: landmarks) {
194+ state = . boundingBox( enterTime: Date ( ) )
195+ boundingBoxMaskWidth = 0
202196 }
203- } else {
204- state = . introBoundingBox
205- }
206- case . introExercise( _) :
207- DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.5 ) {
208- state = . exercise( SessionData ( count: 0 , seconds: 0 ) , enterTime: Date ( ) )
209- }
210- case . exercise( _, let enterDate) :
211- let secondsElapsed = Int ( - enterDate. timeIntervalSinceNow)
212-
213- if let feedback = feedback [ sessionConfig. exercise. features. first!] {
214- feedbackText = feedback. displayString
215- } else {
216- feedbackText = nil
197+ case . boundingBox( let enterDate) :
198+ if let landmarks = landmarks, canMoveFromBoundingBox ( landmarks: landmarks) {
199+ let timeSinceInsideBBox = - enterDate. timeIntervalSinceNow
200+ boundingBoxMaskWidth = timeSinceInsideBBox / 2
201+ if timeSinceInsideBBox > 2 {
202+ state = . introExercise( sessionConfig. exercise)
203+ }
204+ } else {
205+ state = . introBoundingBox
206+ }
207+ case . introExercise( _) :
208+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.5 ) {
209+ state = . exercise( SessionData ( count: 0 , seconds: 0 ) , enterTime: Date ( ) )
210+ }
211+ case . exercise( _, let enterDate) :
212+ let secondsElapsed = Int ( - enterDate. timeIntervalSinceNow)
217213
218- if case . fitness = sessionConfig. exercise. features. first, let result = features [ sessionConfig. exercise. features. first!] {
219- _ = counter. count ( result. value) { newState in
220- if !newState. isEntered {
221- Text2Speech ( text: " \( counter. state. count) " ) . say ( )
222- DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.1 ) {
223- withAnimation ( . easeInOut( duration: 0.1 ) ) {
224- countScale = 2.0
225- }
226- DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.4 ) {
227- withAnimation ( . easeInOut( duration: 0.2 ) ) {
228- countScale = 1.0
214+ if let feedback = feedback [ sessionConfig. exercise. features. first!] {
215+ feedbackText = feedback. displayString
216+ } else {
217+ feedbackText = nil
218+
219+ if case . fitness = sessionConfig. exercise. features. first, let result = features [ sessionConfig. exercise. features. first!] {
220+ _ = counter. count ( result. value) { newState in
221+ if !newState. isEntered {
222+ Text2Speech ( text: " \( counter. state. count) " ) . say ( )
223+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.1 ) {
224+ withAnimation ( . easeInOut( duration: 0.1 ) ) {
225+ countScale = 2.0
226+ }
227+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.4 ) {
228+ withAnimation ( . easeInOut( duration: 0.2 ) ) {
229+ countScale = 1.0
230+ }
229231 }
230232 }
231233 }
232234 }
233235 }
234236 }
237+
238+ let newResults = SessionData ( count: counter. state. count, seconds: secondsElapsed)
239+ state = . exercise( newResults, enterTime: enterDate) // refresh view for every updated second
240+ var hasFinished = false
241+ if sessionConfig. useReps {
242+ hasFinished = counter. state. count >= sessionConfig. nReps
243+ } else {
244+ hasFinished = secondsElapsed >= sessionConfig. nSeconds + sessionConfig. nMinutes * 60
245+ }
246+
247+ if hasFinished {
248+ state = . results( newResults)
249+ quickPose. stop ( )
250+ }
251+ default :
252+ break
235253 }
236-
237- let newResults = SessionData ( count: counter. state. count, seconds: secondsElapsed)
238- state = . exercise( newResults, enterTime: enterDate) // refresh view for every updated second
239- var hasFinished = false
240- if sessionConfig. useReps {
241- hasFinished = counter. state. count >= sessionConfig. nReps
242- } else {
243- hasFinished = secondsElapsed >= sessionConfig. nSeconds + sessionConfig. nMinutes * 60
244- }
245-
246- if hasFinished {
247- state = . results( newResults)
248- quickPose. stop ( )
249- }
250- default :
251- break
254+ } else if state != . startVolume && state != . instructions{
255+ state = . introBoundingBox
252256 }
253- } else if state != . startVolume && state != . instructions{
254- state = . introBoundingBox
255- }
256- } )
257+ } )
258+ }
257259 }
258260 . onDisappear {
259261 UIApplication . shared. isIdleTimerDisabled = false
0 commit comments