From 4bb4d821dfeda1d97ef45c80c76bf9b7a211637b Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Mon, 21 Oct 2024 13:26:02 -0700 Subject: [PATCH 01/30] fix/applying dispatchQueue and RunLoop with commin to ensure the button event fire correctly --- ios/FlankerNativeComponents/GameManager.swift | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index e6d6e2205..1475e0367 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -191,7 +191,11 @@ class GameManager { func checkedAnswer(button: SelectedButton) { invalidateTimers() - delegate?.setEnableButton(isEnable: false) + + DispatchQueue.main.async { + self.delegate?.setEnableButton(isEnable: false) + } + guard let gameParameters = gameParameters else { return } guard let startTrialTimestamp = startTrialTimestamp, @@ -219,7 +223,9 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + DispatchQueue.main.async { + self.delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } } responseText = Constants.correctText } else { @@ -237,7 +243,9 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + DispatchQueue.main.async { + self.delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } } responseText = Constants.inCorrectText } @@ -258,7 +266,9 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + DispatchQueue.main.async { + self.delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } } responseText = Constants.correctText } else { @@ -276,15 +286,17 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + DispatchQueue.main.async { + self.delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } } responseText = Constants.inCorrectText } } - if gameParameters.showFeedback { - Timer.scheduledTimer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) } else { setDefaultText(isFirst: false) } @@ -296,7 +308,7 @@ class GameManager { if !isFirst { countTest += 1 } - + if gameParameters.showFixation { if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { @@ -311,7 +323,8 @@ class GameManager { updateButtonTitle() if gameParameters.showFixation { - timerSetText = Timer.scheduledTimer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) + timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) + RunLoop.main.add(timerSetText!, forMode: .common) } else { setText() } @@ -320,7 +333,10 @@ class GameManager { @objc func setText() { guard let gameParameters = gameParameters else { return } - delegate?.setEnableButton(isEnable: true) + DispatchQueue.main.async { + self.delegate?.setEnableButton(isEnable: true) + } + text = gameParameters.trials[countTest].stimulus.en if let image = URL(string: text), text.contains("https") { @@ -329,15 +345,18 @@ class GameManager { delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) } - timeResponse = Timer.scheduledTimer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) + timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) + RunLoop.main.add(timeResponse!, forMode: .common) } @objc func timeResponseFailed() { guard let gameParameters = gameParameters else { return } - delegate?.setEnableButton(isEnable: false) - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + DispatchQueue.main.async { + self.delegate?.setEnableButton(isEnable: false) + if gameParameters.showFeedback { + self.delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } } guard @@ -360,7 +379,8 @@ class GameManager { delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) responseText = Constants.timeRespondText - Timer.scheduledTimer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) } func clearData() { @@ -386,7 +406,7 @@ private extension GameManager { func isEndGame() -> Bool { guard let gameParameters = gameParameters else { return false } - + if countTest == gameParameters.trials.count { let sumArray = arrayTimes.reduce(0, +) var avrgArray: Int = 0 From 5dc60a0395b6f9a415fe3d243c95c7450502332b Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Mon, 21 Oct 2024 13:51:31 -0700 Subject: [PATCH 02/30] chore/removing extra space --- ios/FlankerNativeComponents/GameManager.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 1475e0367..0dacbd8d3 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -308,7 +308,7 @@ class GameManager { if !isFirst { countTest += 1 } - + if gameParameters.showFixation { if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { @@ -406,7 +406,6 @@ private extension GameManager { func isEndGame() -> Bool { guard let gameParameters = gameParameters else { return false } - if countTest == gameParameters.trials.count { let sumArray = arrayTimes.reduce(0, +) var avrgArray: Int = 0 From 45fd2bdc05bc369f6233a42cbd42fef5e1557a16 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 22 Oct 2024 09:54:57 -0700 Subject: [PATCH 03/30] chore/Transfering the DispatcgQyeye.main.async to FlankerView and removing from Game Manager --- ios/FlankerNativeComponents/FlankerView.swift | 36 ++++++++++--------- ios/FlankerNativeComponents/GameManager.swift | 34 ++++++------------ 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/ios/FlankerNativeComponents/FlankerView.swift b/ios/FlankerNativeComponents/FlankerView.swift index 6fa37e258..c9e9b6e95 100644 --- a/ios/FlankerNativeComponents/FlankerView.swift +++ b/ios/FlankerNativeComponents/FlankerView.swift @@ -318,28 +318,32 @@ class FlankerView: UIView { } extension FlankerView: GameManagerProtocol { - func setEnableButton(isEnable: Bool) { - leftButton.isEnabled = isEnable - rightButton.isEnabled = isEnable - } + func setEnableButton(isEnable: Bool) { + DispatchQueue.main.async { + self.leftButton.isEnabled = isEnable + self.rightButton.isEnabled = isEnable + } + } func updateTime(time: String) { timeLabel.text = time } func updateText(text: String, color: UIColor, font: UIFont, isStart: Bool, typeTime: TypeTimeStamps) { - typeTimeStamp = typeTime - textLabel.font = font - textLabel.text = text - textLabel.textColor = color - textLabel.setNeedsDisplay() - textLabel.layoutSubviews() - startDisplayLink() - let time = CACurrentMediaTime() - print("Marker: self.displayLink?.isPaused = false: \(time)") - textLabel.isHidden = false - fixationImage.isHidden = true - drawPixel() + DispatchQueue.main.async { + typeTimeStamp = typeTime + textLabel.font = font + textLabel.text = text + textLabel.textColor = color + textLabel.setNeedsDisplay() + textLabel.layoutSubviews() + startDisplayLink() + let time = CACurrentMediaTime() + print("Marker: self.displayLink?.isPaused = false: \(time)") + textLabel.isHidden = false + fixationImage.isHidden = true + drawPixel() + } } func updateTitleButton(left: String?, right: String?, leftImage: URL?, rightImage: URL?, countButton: Int) { diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 0dacbd8d3..2e3d124ac 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -192,9 +192,7 @@ class GameManager { func checkedAnswer(button: SelectedButton) { invalidateTimers() - DispatchQueue.main.async { - self.delegate?.setEnableButton(isEnable: false) - } + delegate?.setEnableButton(isEnable: false) guard let gameParameters = gameParameters else { return } guard @@ -223,9 +221,7 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - DispatchQueue.main.async { - self.delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } + delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) } responseText = Constants.correctText } else { @@ -243,9 +239,7 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - DispatchQueue.main.async { - self.delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } + delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) } responseText = Constants.inCorrectText } @@ -266,9 +260,7 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - DispatchQueue.main.async { - self.delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } + delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) } responseText = Constants.correctText } else { @@ -286,9 +278,7 @@ class GameManager { resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - DispatchQueue.main.async { - self.delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } + delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) } responseText = Constants.inCorrectText } @@ -333,9 +323,7 @@ class GameManager { @objc func setText() { guard let gameParameters = gameParameters else { return } - DispatchQueue.main.async { - self.delegate?.setEnableButton(isEnable: true) - } + delegate?.setEnableButton(isEnable: true) text = gameParameters.trials[countTest].stimulus.en @@ -346,17 +334,15 @@ class GameManager { } timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) - RunLoop.main.add(timeResponse!, forMode: .common) + RunLoop.main.add(timeResponse!, forMode: .common) } @objc func timeResponseFailed() { guard let gameParameters = gameParameters else { return } - DispatchQueue.main.async { - self.delegate?.setEnableButton(isEnable: false) - if gameParameters.showFeedback { - self.delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } + delegate?.setEnableButton(isEnable: false) + if gameParameters.showFeedback { + delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) } guard From ccb5a1c98c659ae149e4f22f70f38e06e1879f21 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 22 Oct 2024 10:00:24 -0700 Subject: [PATCH 04/30] chore/applying self to everything inside dispatch in updateText --- ios/FlankerNativeComponents/FlankerView.swift | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ios/FlankerNativeComponents/FlankerView.swift b/ios/FlankerNativeComponents/FlankerView.swift index c9e9b6e95..516cb3846 100644 --- a/ios/FlankerNativeComponents/FlankerView.swift +++ b/ios/FlankerNativeComponents/FlankerView.swift @@ -331,18 +331,18 @@ extension FlankerView: GameManagerProtocol { func updateText(text: String, color: UIColor, font: UIFont, isStart: Bool, typeTime: TypeTimeStamps) { DispatchQueue.main.async { - typeTimeStamp = typeTime - textLabel.font = font - textLabel.text = text - textLabel.textColor = color - textLabel.setNeedsDisplay() - textLabel.layoutSubviews() - startDisplayLink() - let time = CACurrentMediaTime() - print("Marker: self.displayLink?.isPaused = false: \(time)") - textLabel.isHidden = false - fixationImage.isHidden = true - drawPixel() + self.typeTimeStamp = typeTime + self.textLabel.font = font + self.textLabel.text = text + self.textLabel.textColor = color + self.textLabel.setNeedsDisplay() + self.textLabel.layoutSubviews() + self.startDisplayLink() + let time = CACurrentMediaTime() + print("Marker: self.displayLink?.isPaused = false: \(time)") + self.textLabel.isHidden = false + self.fixationImage.isHidden = true + self.drawPixel() } } From d044e6d8903f7217c9c1b725788b28132a4d98dd Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 24 Oct 2024 15:00:22 -0700 Subject: [PATCH 05/30] feature/keep button enabled pn Game manager and handling when it should be disabled --- ios/FlankerNativeComponents/GameManager.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 2e3d124ac..c16cc3cb8 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -192,7 +192,9 @@ class GameManager { func checkedAnswer(button: SelectedButton) { invalidateTimers() - delegate?.setEnableButton(isEnable: false) + if let gameParameters = gameParameters, gameParameters.showFeedback { + delegate?.setEnableButton(isEnable: false) + } guard let gameParameters = gameParameters else { return } guard @@ -301,6 +303,7 @@ class GameManager { if gameParameters.showFixation { + delegate?.setEnableButton(isEnable: false) if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { delegate?.updateFixations(image: image, isStart: false, typeTime: .fixations) } else { From fb94461e29e6871c316bf853588c1f5936cbaa9b Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 24 Oct 2024 15:14:29 -0700 Subject: [PATCH 06/30] enabling the buttom --- ios/FlankerNativeComponents/GameManager.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index c16cc3cb8..02adaaf9a 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -102,6 +102,7 @@ class GameManager { func startLogicTimer() { invalidateTimers() + delegate?.setEnableButton(isEnable: true) setDefaultText(isFirst: true) } @@ -311,7 +312,10 @@ class GameManager { } } - if isEndGame() { return } + if isEndGame() { + delegate?.setEnableButton(isEnable: true) + return + } invalidateTimers() updateButtonTitle() @@ -406,6 +410,7 @@ private extension GameManager { setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) } delegate?.resultTest(avrgTime: avrgArray, procentCorrect: Int(procentsCorrect), data: nil, dataArray: resultManager.oneGameDataResult, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) + delegate?.setEnableButton(isEnable: true) clearData() return true } else { From 58e678501f569022ed0fa381fbd45f615230e2e6 Mon Sep 17 00:00:00 2001 From: Carlos Chacon Date: Thu, 24 Oct 2024 18:32:52 -0600 Subject: [PATCH 07/30] adjust button enable/disable triggers --- ios/FlankerNativeComponents/GameManager.swift | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 02adaaf9a..1dae5f70b 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -193,9 +193,9 @@ class GameManager { func checkedAnswer(button: SelectedButton) { invalidateTimers() - if let gameParameters = gameParameters, gameParameters.showFeedback { - delegate?.setEnableButton(isEnable: false) - } +// if let gameParameters = gameParameters, gameParameters.showFeedback { +// delegate?.setEnableButton(isEnable: false) +// } guard let gameParameters = gameParameters else { return } guard @@ -296,6 +296,7 @@ class GameManager { } @objc func setDefaultText(isFirst: Bool) { + invalidateTimers() guard let gameParameters = gameParameters else { return } if !isFirst { @@ -304,7 +305,6 @@ class GameManager { if gameParameters.showFixation { - delegate?.setEnableButton(isEnable: false) if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { delegate?.updateFixations(image: image, isStart: false, typeTime: .fixations) } else { @@ -315,11 +315,11 @@ class GameManager { if isEndGame() { delegate?.setEnableButton(isEnable: true) return - } - invalidateTimers() + } updateButtonTitle() if gameParameters.showFixation { + delegate?.setEnableButton(isEnable: false) timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) RunLoop.main.add(timerSetText!, forMode: .common) } else { @@ -345,10 +345,11 @@ class GameManager { } @objc func timeResponseFailed() { + invalidateTimers() guard let gameParameters = gameParameters else { return } - delegate?.setEnableButton(isEnable: false) if gameParameters.showFeedback { + delegate?.setEnableButton(isEnable: false) delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) } From 5a610651b26cb67dbc86e7282783b4f8b71dda5d Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Fri, 25 Oct 2024 19:14:58 -0700 Subject: [PATCH 08/30] fixing input detection --- ios/FlankerNativeComponents/GameManager.swift | 94 ++++++++++++++----- 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 1dae5f70b..39c964688 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -71,11 +71,13 @@ class GameManager { private var startFeedbackTimestamp: Double? private var endFeedbackTimestamp: Double? private var respondTouchButton: Double? - + private var isFirst = true private var gameParameters: ParameterModel? + // **** I used this var to avoit multiple responses while button is enabled and incrementing the countTest + private var hasResponded = false weak var delegate: GameManagerProtocol? @@ -191,18 +193,38 @@ class GameManager { } func checkedAnswer(button: SelectedButton) { - invalidateTimers() + // Prevent and block multiple responses per trial + guard !hasResponded else { + print("[GameManager.swift] User has already responded in this trial.") // <---- if is a better tracer handling let me know. + return + } + hasResponded = true // Mark that the user has responded -// if let gameParameters = gameParameters, gameParameters.showFeedback { -// delegate?.setEnableButton(isEnable: false) -// } + invalidateTimers() guard let gameParameters = gameParameters else { return } - guard - let startTrialTimestamp = startTrialTimestamp, - let endTrialTimestamp = endTrialTimestamp, - let respondTouchButton = respondTouchButton - else { return } + + guard countTest < gameParameters.trials.count else { // Added guard to prevent user pick wrong element in array + print("Error: countTest \(countTest) doesn't exists in checkedAnswer") + return + } + + // ****** Ensure startTrialTimestamp is set ****** + guard let startTrialTimestamp = startTrialTimestamp else { + print("**************** Error: startTrialTimestamp is nil in checkedAnswer ****************") + return + } + + if respondTouchButton == nil { + respondTouchButton = CACurrentMediaTime() + } + + guard let respondTouchButton = respondTouchButton else { return } + + if endTrialTimestamp == nil { + endTrialTimestamp = respondTouchButton + } + let resultTime = (respondTouchButton - startTrialTimestamp) * 1000 arrayTimes.append(resultTime.convertToInt()) delegate?.updateTime(time: String(format: "%.3f", resultTime)) @@ -213,7 +235,7 @@ class GameManager { let model = FlankerModel(rt: resultTime, stimulus: text, button_pressed: "0", - image_time: endTrialTimestamp * 1000, + image_time: endTrialTimestamp! * 1000, // < ------ making it unwrap, I've been reading that this is used to force unwrap the optional value, this is recommended when we are performing arithmetic operations that require non-optional values example: https://www.hackingwithswift.com/sixty/10/4/force-unwrapping correct: true, start_timestamp: 0, tag: Constants.tag, @@ -231,7 +253,7 @@ class GameManager { let model = FlankerModel(rt: resultTime, stimulus: text, button_pressed: "0", - image_time: endTrialTimestamp * 1000, + image_time: endTrialTimestamp! * 1000, correct: false, start_timestamp: 0, tag: Constants.tag, @@ -252,7 +274,7 @@ class GameManager { let model = FlankerModel(rt: resultTime, stimulus: text, button_pressed: "1", - image_time: endTrialTimestamp * 1000, + image_time: endTrialTimestamp! * 1000, correct: true, start_timestamp: 0, tag: Constants.tag, @@ -270,7 +292,7 @@ class GameManager { let model = FlankerModel(rt: resultTime, stimulus: text, button_pressed: "1", - image_time: endTrialTimestamp * 1000, + image_time: endTrialTimestamp! * 1000, correct: false, start_timestamp: 0, tag: Constants.tag, @@ -299,10 +321,22 @@ class GameManager { invalidateTimers() guard let gameParameters = gameParameters else { return } + //Reset hasResponded at the start of each trial + hasResponded = false + if !isFirst { countTest += 1 } + // I moved it to the top to be checked before enter in condition because I was getting error. + if isEndGame() { + delegate?.setEnableButton(isEnable: true) + return + } + //here I am re-creating the timestamps for the new trial + startTrialTimestamp = nil + endTrialTimestamp = nil + respondTouchButton = nil if gameParameters.showFixation { if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { @@ -312,10 +346,6 @@ class GameManager { } } - if isEndGame() { - delegate?.setEnableButton(isEnable: true) - return - } updateButtonTitle() if gameParameters.showFixation { @@ -330,6 +360,12 @@ class GameManager { @objc func setText() { guard let gameParameters = gameParameters else { return } + // Ensure countTest is within bounds before accessing trials + guard countTest < gameParameters.trials.count else { + print(" \n\n ************** Error: countTest \(countTest) doesn't exists in setText ********************* ") // <--- we can discuss a better error handling, I left this log like this to be visible on xcode. + return + } + delegate?.setEnableButton(isEnable: true) text = gameParameters.trials[countTest].stimulus.en @@ -340,6 +376,9 @@ class GameManager { delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) } + // Set startTrialTimestamp when the trial starts + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .trial) + timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) RunLoop.main.add(timeResponse!, forMode: .common) } @@ -354,14 +393,18 @@ class GameManager { } guard - let startTrialTimestamp = startTrialTimestamp, - let endTrialTimestamp = endTrialTimestamp + let startTrialTimestamp = startTrialTimestamp else { return } + // Set endTrialTimestamp if not set + if endTrialTimestamp == nil { + endTrialTimestamp = CACurrentMediaTime() + } + let model = FlankerModel(rt: 0.0, stimulus: text, button_pressed: nil, - image_time: endTrialTimestamp * 1000, // має намалювати + image_time: endTrialTimestamp! * 1000, * 1000, // має намалювати correct: false, start_timestamp: 0, // вже намальовано tag: Constants.tag, @@ -400,7 +443,8 @@ private extension GameManager { func isEndGame() -> Bool { guard let gameParameters = gameParameters else { return false } - if countTest == gameParameters.trials.count { + //preventing user get element of an array or collection using an index that is wrong + if countTest >= gameParameters.trials.count { let sumArray = arrayTimes.reduce(0, +) var avrgArray: Int = 0 if arrayTimes.count != 0 { @@ -427,6 +471,12 @@ private extension GameManager { func updateButtonTitle() { guard let gameParameters = gameParameters else { return } + // Ensure countTest is within bounds before accessing trials + guard countTest < gameParameters.trials.count else { + print("********************** Error: countTest \(countTest) doesn't exists in updateButtonTitle **********************") + return + } + if gameParameters.trials[countTest].choices.count == 2 { if let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), From ea005624af7f4269a36be1f799750abe06865652 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 29 Oct 2024 10:36:49 -0700 Subject: [PATCH 09/30] removing comments --- ios/FlankerNativeComponents/GameManager.swift | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 39c964688..88f171a51 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -76,7 +76,6 @@ class GameManager { private var isFirst = true private var gameParameters: ParameterModel? - // **** I used this var to avoit multiple responses while button is enabled and incrementing the countTest private var hasResponded = false weak var delegate: GameManagerProtocol? @@ -193,25 +192,23 @@ class GameManager { } func checkedAnswer(button: SelectedButton) { - // Prevent and block multiple responses per trial guard !hasResponded else { - print("[GameManager.swift] User has already responded in this trial.") // <---- if is a better tracer handling let me know. + print("[GameManager.swift]: User has already responded in this trial.") return } - hasResponded = true // Mark that the user has responded + hasResponded = true invalidateTimers() guard let gameParameters = gameParameters else { return } - guard countTest < gameParameters.trials.count else { // Added guard to prevent user pick wrong element in array + guard countTest < gameParameters.trials.count else { print("Error: countTest \(countTest) doesn't exists in checkedAnswer") return } - // ****** Ensure startTrialTimestamp is set ****** guard let startTrialTimestamp = startTrialTimestamp else { - print("**************** Error: startTrialTimestamp is nil in checkedAnswer ****************") + print("[GameManager.swift]: startTrialTimestamp is nil in checkedAnswer") return } @@ -235,7 +232,7 @@ class GameManager { let model = FlankerModel(rt: resultTime, stimulus: text, button_pressed: "0", - image_time: endTrialTimestamp! * 1000, // < ------ making it unwrap, I've been reading that this is used to force unwrap the optional value, this is recommended when we are performing arithmetic operations that require non-optional values example: https://www.hackingwithswift.com/sixty/10/4/force-unwrapping + image_time: endTrialTimestamp! * 1000, correct: true, start_timestamp: 0, tag: Constants.tag, @@ -321,19 +318,17 @@ class GameManager { invalidateTimers() guard let gameParameters = gameParameters else { return } - //Reset hasResponded at the start of each trial hasResponded = false if !isFirst { countTest += 1 } - // I moved it to the top to be checked before enter in condition because I was getting error. + if isEndGame() { delegate?.setEnableButton(isEnable: true) return } - //here I am re-creating the timestamps for the new trial startTrialTimestamp = nil endTrialTimestamp = nil respondTouchButton = nil @@ -360,9 +355,8 @@ class GameManager { @objc func setText() { guard let gameParameters = gameParameters else { return } - // Ensure countTest is within bounds before accessing trials guard countTest < gameParameters.trials.count else { - print(" \n\n ************** Error: countTest \(countTest) doesn't exists in setText ********************* ") // <--- we can discuss a better error handling, I left this log like this to be visible on xcode. + print("[GameManager.swift]: countTest \(countTest) doesn't exists in setText") return } @@ -376,7 +370,6 @@ class GameManager { delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) } - // Set startTrialTimestamp when the trial starts setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .trial) timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) @@ -396,7 +389,6 @@ class GameManager { let startTrialTimestamp = startTrialTimestamp else { return } - // Set endTrialTimestamp if not set if endTrialTimestamp == nil { endTrialTimestamp = CACurrentMediaTime() } @@ -443,7 +435,6 @@ private extension GameManager { func isEndGame() -> Bool { guard let gameParameters = gameParameters else { return false } - //preventing user get element of an array or collection using an index that is wrong if countTest >= gameParameters.trials.count { let sumArray = arrayTimes.reduce(0, +) var avrgArray: Int = 0 @@ -471,9 +462,8 @@ private extension GameManager { func updateButtonTitle() { guard let gameParameters = gameParameters else { return } - // Ensure countTest is within bounds before accessing trials guard countTest < gameParameters.trials.count else { - print("********************** Error: countTest \(countTest) doesn't exists in updateButtonTitle **********************") + print("[GameManager.swift]: countTest \(countTest) doesn't exists in updateButtonTitle") return } From bf542c72e202b1e57f9e7eb5719000b12c70df41 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 29 Oct 2024 10:38:52 -0700 Subject: [PATCH 10/30] removing extra space --- ios/FlankerNativeComponents/GameManager.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 88f171a51..63cfdf3a4 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -71,7 +71,6 @@ class GameManager { private var startFeedbackTimestamp: Double? private var endFeedbackTimestamp: Double? private var respondTouchButton: Double? - private var isFirst = true From 7ee142e609f9149452f767af2fd06a981abb6996 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Fri, 1 Nov 2024 00:49:52 -0700 Subject: [PATCH 11/30] input detection, creating debounce, back with setEnableButton --- ios/FlankerNativeComponents/GameManager.swift | 698 +++++++----------- 1 file changed, 263 insertions(+), 435 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 63cfdf3a4..d8db36ca7 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -10,493 +10,321 @@ import Foundation import UIKit enum SelectedButton { - case left - case right + case left + case right } enum Constants { - static let lowTimeInterval: TimeInterval = 0.5 - static let moreTimeInterval: TimeInterval = 3 - static let blueColor: UIColor = UIColor(red: 37, green: 95, blue: 158) - static let greenColor: UIColor = UIColor(red: 68, green: 133, blue: 87) - static let redColor: UIColor = UIColor(red: 199, green: 20, blue: 20) - static let correctText: String = "Correct!" - static let inCorrectText: String = "Incorrect" - static let timeRespondText: String = "Respond faster" - static let bigFont: UIFont = .systemFont(ofSize: 50.0, weight: .bold) - static let smallFont: UIFont = .systemFont(ofSize: 30.0, weight: .bold) - static let tag: String = "trial" - static let trialTag: String = "html-button-response" + static let lowTimeInterval: TimeInterval = 0.5 + static let debounceInterval: TimeInterval = 0.25 + static let blueColor: UIColor = UIColor(red: 37, green: 95, blue: 158) + static let greenColor: UIColor = UIColor(red: 68, green: 133, blue: 87) + static let redColor: UIColor = UIColor(red: 199, green: 20, blue: 20) + static let correctText: String = "Correct!" + static let inCorrectText: String = "Incorrect" + static let timeRespondText: String = "Respond faster" + static let bigFont: UIFont = .systemFont(ofSize: 50.0, weight: .bold) + static let smallFont: UIFont = .systemFont(ofSize: 30.0, weight: .bold) + static let tag: String = "trial" + static let trialTag: String = "html-button-response" } enum TypeTimeStamps { - case fixations - case trial - case feedback - case response + case fixations + case trial + case feedback + case response } protocol GameManagerProtocol: AnyObject { - func updateText(text: String, color: UIColor, font: UIFont, isStart: Bool, typeTime: TypeTimeStamps) - func updateFixations(image: URL?, isStart: Bool, typeTime: TypeTimeStamps) - func updateTime(time: String) - func setEnableButton(isEnable: Bool) - func updateTitleButton(left: String?, right: String?, leftImage: URL?, rightImage: URL?, countButton: Int) - func resultTest(avrgTime: Int?, procentCorrect: Int?, data: FlankerModel?, dataArray: [FlankerModel]?, isShowResults: Bool, minAccuracy: Int) + func updateText(text: String, color: UIColor, font: UIFont, isStart: Bool, typeTime: TypeTimeStamps) + func updateFixations(image: URL?, isStart: Bool, typeTime: TypeTimeStamps) + func updateTime(time: String) + func setEnableButton(isEnable: Bool) + func updateTitleButton(left: String?, right: String?, leftImage: URL?, rightImage: URL?, countButton: Int) + func resultTest(avrgTime: Int?, procentCorrect: Int?, data: FlankerModel?, dataArray: [FlankerModel]?, isShowResults: Bool, minAccuracy: Int) } class GameManager { - private let resultManager = ResultManager.shared - - private var text: String = "" - private var responseText: String = "" - - private var timerSetText: Timer? - private var timeResponse: Timer? - - private var countTest = 0 - private var countAllGame = 0 - private var correctAnswers = 0 - - private var timeSpeedGame: TimeInterval = 0.5 - private var isShowFeedback = true - private var isShowFixations = true - private var isShowResults = true - private var arrayTimes: [Int] = [] - - private var startFixationsTimestamp: Double? - private var endFixationsTimestamp: Double? - private var startTrialTimestamp: Double? - private var endTrialTimestamp: Double? - private var startFeedbackTimestamp: Double? - private var endFeedbackTimestamp: Double? - private var respondTouchButton: Double? - - private var isFirst = true - - private var gameParameters: ParameterModel? - private var hasResponded = false - - weak var delegate: GameManagerProtocol? - - func startGame(timeSpeed: Float, isShowAnswers: Bool, countGame: Int) { - countAllGame = countGame - timeSpeedGame = TimeInterval(timeSpeed) - isShowFeedback = isShowAnswers - startLogicTimer() - } - - func parameterGame() { - guard let parameters = ParameterGameManager.shared.getParameters() else { return } - gameParameters = parameters - isShowFeedback = parameters.showFeedback - isShowFixations = parameters.showFixation - isShowResults = parameters.showResults - countAllGame = parameters.trials.count - updateButtonTitle() - resultManager.cleanData() - countTest = 0 - correctAnswers = 0 - startLogicTimer() - } - - func startLogicTimer() { - invalidateTimers() - delegate?.setEnableButton(isEnable: true) - setDefaultText(isFirst: true) - } - - func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { - if isStart { - switch type { - case .fixations: - startFixationsTimestamp = time - - if - let startFeedbackTimestamp = startFeedbackTimestamp, - let endFeedbackTimestamp = endFeedbackTimestamp, - let gameParameters = gameParameters, - gameParameters.showFeedback { - let resultTime = (time - startFeedbackTimestamp) * 1000 - let model = FlankerModel(rt: resultTime, - stimulus: "
\(responseText)
", - button_pressed: nil, - image_time: endFeedbackTimestamp * 1000, - correct: nil, - start_timestamp: 0, - tag: "feedback", - trial_index: countTest, - start_time: startFeedbackTimestamp * 1000, - response_touch_timestamp: 0) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - resultManager.addStepData(data: model) - } - case .trial: - startTrialTimestamp = time - - if - let startFixationsTimestamp = startFixationsTimestamp, - let endFixationsTimestamp = endFixationsTimestamp, - let gameParameters = gameParameters, - gameParameters.showFixation { - let resultTime = (time - startFixationsTimestamp) * 1000 - let model = FlankerModel(rt: resultTime, - stimulus: "
-----
", - button_pressed: nil, - image_time: endFixationsTimestamp * 1000, - correct: nil, - start_timestamp: 0, - tag: "fixation", - trial_index: countTest + 1, - start_time: startFixationsTimestamp * 1000, - response_touch_timestamp: 0) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - resultManager.addStepData(data: model) - } else if - let startFeedbackTimestamp = startFeedbackTimestamp, - let endFeedbackTimestamp = endFeedbackTimestamp, - let gameParameters = gameParameters, - gameParameters.showFeedback, - !gameParameters.showFixation { - let resultTime = (time - startFeedbackTimestamp) * 1000 - let model = FlankerModel(rt: resultTime, - stimulus: "
\(responseText)
", - button_pressed: nil, - image_time: endFeedbackTimestamp * 1000, - correct: nil, - start_timestamp: 0, - tag: "feedback", - trial_index: countTest, - start_time: startFeedbackTimestamp * 1000, - response_touch_timestamp: 0) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - resultManager.addStepData(data: model) - } - case .feedback: - startFeedbackTimestamp = time - case .response: break - } - } else { - switch type { - case .fixations: - endFixationsTimestamp = time - case .trial: - endTrialTimestamp = time - case .feedback: - endFeedbackTimestamp = time - case .response: - respondTouchButton = time - } + private let resultManager = ResultManager.shared + private var text: String = "" + private var responseText: String = "" + + private var timerSetText: Timer? + private var timeResponse: Timer? + private var debounceTimer: Timer? + + private var countTest = 0 + private var countAllGame = 0 + private var correctAnswers = 0 + + private var timeSpeedGame: TimeInterval = 0.5 + private var isShowFeedback = true + private var isShowFixations = true + private var isShowResults = true + private var arrayTimes: [Int] = [] + + private var startFixationsTimestamp: Double? + private var endFixationsTimestamp: Double? + private var startTrialTimestamp: Double? + private var endTrialTimestamp: Double? + private var startFeedbackTimestamp: Double? + private var endFeedbackTimestamp: Double? + private var respondTouchButton: Double? + + private var isFirst = true + private var inFeedback = false + private var clickedInCurrentBlock = false + + private var gameParameters: ParameterModel? + + weak var delegate: GameManagerProtocol? + + func startGame(timeSpeed: Float, isShowAnswers: Bool, countGame: Int) { + countAllGame = countGame + timeSpeedGame = TimeInterval(timeSpeed) + isShowFeedback = isShowAnswers + startLogicTimer() } - } - func checkedAnswer(button: SelectedButton) { - guard !hasResponded else { - print("[GameManager.swift]: User has already responded in this trial.") - return + func parameterGame() { + guard let parameters = ParameterGameManager.shared.getParameters() else { return } + gameParameters = parameters + isShowFeedback = parameters.showFeedback + isShowFixations = parameters.showFixation + isShowResults = parameters.showResults + countAllGame = parameters.trials.count + updateButtonTitle() + resultManager.cleanData() + countTest = 0 + correctAnswers = 0 + startLogicTimer() } - hasResponded = true - - invalidateTimers() - guard let gameParameters = gameParameters else { return } - - guard countTest < gameParameters.trials.count else { - print("Error: countTest \(countTest) doesn't exists in checkedAnswer") - return + func startLogicTimer() { + invalidateTimers() + setDefaultText(isFirst: true) } - guard let startTrialTimestamp = startTrialTimestamp else { - print("[GameManager.swift]: startTrialTimestamp is nil in checkedAnswer") - return - } - - if respondTouchButton == nil { - respondTouchButton = CACurrentMediaTime() - } - - guard let respondTouchButton = respondTouchButton else { return } - - if endTrialTimestamp == nil { - endTrialTimestamp = respondTouchButton + func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { + if isStart { + switch type { + case .fixations: + startFixationsTimestamp = time + case .trial: + startTrialTimestamp = time + case .feedback: + startFeedbackTimestamp = time + case .response: + respondTouchButton = time + } + } else { + switch type { + case .fixations: + endFixationsTimestamp = time + case .trial: + endTrialTimestamp = time + case .feedback: + endFeedbackTimestamp = time + case .response: + respondTouchButton = time + } + } } - let resultTime = (respondTouchButton - startTrialTimestamp) * 1000 - arrayTimes.append(resultTime.convertToInt()) - delegate?.updateTime(time: String(format: "%.3f", resultTime)) - switch button { - case .left: - if gameParameters.trials[countTest].correctChoice == 0 { - correctAnswers += 1 - let model = FlankerModel(rt: resultTime, - stimulus: text, - button_pressed: "0", - image_time: endTrialTimestamp! * 1000, - correct: true, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton * 1000) + func checkedAnswer(button: SelectedButton) { + guard !inFeedback && !clickedInCurrentBlock else { return } + clickedInCurrentBlock = true + invalidateTimers() - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + debounceTimer?.invalidate() + debounceTimer = Timer.scheduledTimer(withTimeInterval: 0.25, repeats: false) { [weak self] _ in + self?.processCheckedAnswer(button: button) } - responseText = Constants.correctText - } else { - let model = FlankerModel(rt: resultTime, - stimulus: text, - button_pressed: "0", - image_time: endTrialTimestamp! * 1000, - correct: false, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton * 1000) + } - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + private func processCheckedAnswer(button: SelectedButton) { + delegate?.setEnableButton(isEnable: false) + + guard let gameParameters = gameParameters else { return } + guard + let startTrialTimestamp = startTrialTimestamp, + let respondTouchButton = respondTouchButton + else { return } + + let resultTime = (respondTouchButton - startTrialTimestamp) * 1000 + arrayTimes.append(resultTime.convertToInt()) + delegate?.updateTime(time: String(format: "%.3f", resultTime)) + + let correctChoice = (button == .left && gameParameters.trials[countTest].correctChoice == 0) || + (button == .right && gameParameters.trials[countTest].correctChoice == 1) + + if correctChoice { + correctAnswers += 1 + if gameParameters.showFeedback { + delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } + responseText = Constants.correctText + } else { + if gameParameters.showFeedback { + delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } + responseText = Constants.inCorrectText } - responseText = Constants.inCorrectText - } - case .right: - if gameParameters.trials[countTest].correctChoice == 1 { - correctAnswers += 1 - let model = FlankerModel(rt: resultTime, - stimulus: text, - button_pressed: "1", - image_time: endTrialTimestamp! * 1000, - correct: true, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton * 1000) - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + inFeedback = true + Timer.scheduledTimer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + } else { + setDefaultText(isFirst: false) } - responseText = Constants.correctText - } else { - let model = FlankerModel(rt: resultTime, - stimulus: text, - button_pressed: "1", - image_time: endTrialTimestamp! * 1000, - correct: false, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton * 1000) - - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } - responseText = Constants.inCorrectText - } } - if gameParameters.showFeedback { - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) - } else { - setDefaultText(isFirst: false) - } - } + @objc func setDefaultText(isFirst: Bool) { + guard let gameParameters = gameParameters else { return } - @objc func setDefaultText(isFirst: Bool) { - invalidateTimers() - guard let gameParameters = gameParameters else { return } + inFeedback = false + clickedInCurrentBlock = false - hasResponded = false - - if !isFirst { - countTest += 1 - } + if !isFirst { + countTest += 1 + } - if isEndGame() { - delegate?.setEnableButton(isEnable: true) - return - } + if gameParameters.showFixation { + if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { + delegate?.updateFixations(image: image, isStart: false, typeTime: .fixations) + } else { + delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: false, typeTime: .fixations) + } + } - startTrialTimestamp = nil - endTrialTimestamp = nil - respondTouchButton = nil + if isEndGame() { return } + invalidateTimers() + updateButtonTitle() - if gameParameters.showFixation { - if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { - delegate?.updateFixations(image: image, isStart: false, typeTime: .fixations) - } else { - delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: false, typeTime: .fixations) - } + if gameParameters.showFixation { + delegate?.setEnableButton(isEnable: false) + timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) + RunLoop.main.add(timerSetText!, forMode: .common) + } else { + setText() + } } - updateButtonTitle() + @objc func setText() { + guard let gameParameters = gameParameters else { return } - if gameParameters.showFixation { - delegate?.setEnableButton(isEnable: false) - timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) - RunLoop.main.add(timerSetText!, forMode: .common) - } else { - setText() - } - } + text = gameParameters.trials[countTest].stimulus.en - @objc func setText() { - guard let gameParameters = gameParameters else { return } + if let image = URL(string: text), text.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) + } else { + delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) + } - guard countTest < gameParameters.trials.count else { - print("[GameManager.swift]: countTest \(countTest) doesn't exists in setText") - return + delegate?.setEnableButton(isEnable: true) + timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(timeResponseFailed), userInfo: nil, repeats: false) + RunLoop.main.add(timeResponse!, forMode: .common) } - delegate?.setEnableButton(isEnable: true) - - text = gameParameters.trials[countTest].stimulus.en + @objc func timeResponseFailed() { + guard let gameParameters = gameParameters else { return } - if let image = URL(string: text), text.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) - } else { - delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) - } + delegate?.setEnableButton(isEnable: false) + delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .trial) + guard + let startTrialTimestamp = startTrialTimestamp, + let endTrialTimestamp = endTrialTimestamp + else { return } - timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) - RunLoop.main.add(timeResponse!, forMode: .common) - } + let model = FlankerModel(rt: 0.0, + stimulus: text, + button_pressed: nil, + image_time: endTrialTimestamp * 1000, // має намалювати + correct: false, + start_timestamp: 0, // вже намальовано + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: 0) - @objc func timeResponseFailed() { - invalidateTimers() - guard let gameParameters = gameParameters else { return } + resultManager.addStepData(data: model) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) + responseText = Constants.timeRespondText - if gameParameters.showFeedback { - delegate?.setEnableButton(isEnable: false) - delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) } - guard - let startTrialTimestamp = startTrialTimestamp - else { return } - - if endTrialTimestamp == nil { - endTrialTimestamp = CACurrentMediaTime() + func clearData() { + resultManager.cleanData() + countTest = 0 + correctAnswers = 0 + arrayTimes = [] + invalidateTimers() } - let model = FlankerModel(rt: 0.0, - stimulus: text, - button_pressed: nil, - image_time: endTrialTimestamp! * 1000, * 1000, // має намалювати - correct: false, - start_timestamp: 0, // вже намальовано - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: 0) - - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - responseText = Constants.timeRespondText - - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) - } - - func clearData() { - resultManager.cleanData() - countTest = 0 - correctAnswers = 0 - arrayTimes = [] - invalidateTimers() - } -} - -private extension GameManager { - func randomString(length: Int = 5) -> String { - let letters = "<>" - let lettersArray = Array(letters) - let symbolArray = [">>", "<<", "--"] - - let randSymbol = arc4random_uniform(UInt32(symbolArray.count)) - let randLetters = arc4random_uniform(UInt32(lettersArray.count)) - - return symbolArray[Int(randSymbol)] + String(lettersArray[Int(randLetters)]) + symbolArray[Int(randSymbol)] - } - - func isEndGame() -> Bool { - guard let gameParameters = gameParameters else { return false } - if countTest >= gameParameters.trials.count { - let sumArray = arrayTimes.reduce(0, +) - var avrgArray: Int = 0 - if arrayTimes.count != 0 { - avrgArray = sumArray / arrayTimes.count - } - let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 - if !gameParameters.showFixation { - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) - } - delegate?.resultTest(avrgTime: avrgArray, procentCorrect: Int(procentsCorrect), data: nil, dataArray: resultManager.oneGameDataResult, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - delegate?.setEnableButton(isEnable: true) - clearData() - return true - } else { - return false + private func invalidateTimers() { + timeResponse?.invalidate() + timerSetText?.invalidate() + debounceTimer?.invalidate() } - } - - func invalidateTimers() { - timeResponse?.invalidate() - timerSetText?.invalidate() - } - - func updateButtonTitle() { - guard let gameParameters = gameParameters else { return } - - guard countTest < gameParameters.trials.count else { - print("[GameManager.swift]: countTest \(countTest) doesn't exists in updateButtonTitle") - return + + private func updateButtonTitle() { + guard let gameParameters = gameParameters else { return } + + if gameParameters.trials[countTest].choices.count == 2 { + if + let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), + let rightImage = URL(string: gameParameters.trials[countTest].choices[1].name.en), + gameParameters.trials[countTest].choices[0].name.en.contains("https"), + gameParameters.trials[countTest].choices[1].name.en.contains("https") { + delegate?.updateTitleButton(left: nil, right: nil, leftImage: leftImage, rightImage: rightImage, countButton: 2) + } + else if + let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), + gameParameters.trials[countTest].choices[0].name.en.contains("https"), + !gameParameters.trials[countTest].choices[1].name.en.contains("https") { + delegate?.updateTitleButton(left: nil, right: gameParameters.trials[countTest].choices[1].name.en, leftImage: leftImage, rightImage: nil, countButton: 2) + } + else if + let rightImage = URL(string: gameParameters.trials[countTest].choices[1].name.en), + gameParameters.trials[countTest].choices[1].name.en.contains("https"), + !gameParameters.trials[countTest].choices[0].name.en.contains("https") { + delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: nil, leftImage: nil, rightImage: rightImage, countButton: 2) + } + else { + delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: gameParameters.trials[countTest].choices[1].name.en, leftImage: nil, rightImage: nil, countButton: 2) + } + } else { + if + let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), + gameParameters.trials[countTest].choices[0].name.en.contains("https") { + delegate?.updateTitleButton(left: nil, right: nil, leftImage: leftImage, rightImage: nil, countButton: 1) + } else { + delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: nil, leftImage: nil, rightImage: nil, countButton: 1) + } + } } - if gameParameters.trials[countTest].choices.count == 2 { - if - let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), - let rightImage = URL(string: gameParameters.trials[countTest].choices[1].name.en), - gameParameters.trials[countTest].choices[0].name.en.contains("https"), - gameParameters.trials[countTest].choices[1].name.en.contains("https") { - delegate?.updateTitleButton(left: nil, right: nil, leftImage: leftImage, rightImage: rightImage, countButton: 2) - } - else if - let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), - gameParameters.trials[countTest].choices[0].name.en.contains("https"), - !gameParameters.trials[countTest].choices[1].name.en.contains("https") { - delegate?.updateTitleButton(left: nil, right: gameParameters.trials[countTest].choices[1].name.en, leftImage: leftImage, rightImage: nil, countButton: 2) - } - else if - let rightImage = URL(string: gameParameters.trials[countTest].choices[1].name.en), - gameParameters.trials[countTest].choices[1].name.en.contains("https"), - !gameParameters.trials[countTest].choices[0].name.en.contains("https") { - delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: nil, leftImage: nil, rightImage: rightImage, countButton: 2) - } - else { - delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: gameParameters.trials[countTest].choices[1].name.en, leftImage: nil, rightImage: nil, countButton: 2) - } - } else { - if - let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), - gameParameters.trials[countTest].choices[0].name.en.contains("https") { - delegate?.updateTitleButton(left: nil, right: nil, leftImage: leftImage, rightImage: nil, countButton: 1) - } else { - delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: nil, leftImage: nil, rightImage: nil, countButton: 1) - } + private func isEndGame() -> Bool { + guard let gameParameters = gameParameters else { return false } + if countTest == gameParameters.trials.count { + let sumArray = arrayTimes.reduce(0, +) + var avrgArray: Int = 0 + if arrayTimes.count != 0 { + avrgArray = sumArray / arrayTimes.count + } + let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 + if !gameParameters.showFixation { + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) + } + delegate?.resultTest(avrgTime: avrgArray, procentCorrect: Int(procentsCorrect), data: nil, dataArray: resultManager.oneGameDataResult, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) + clearData() + return true + } else { + return false + } } - } } From 25a33e4b3d18adb48f9d3c086cf4a10b3fd78b99 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 5 Nov 2024 15:06:23 -0800 Subject: [PATCH 12/30] fix/new verion of fix input detection, updating handleEndOfGame, Implementing setEndTimeViewingImage that allows it to capture precise timing information for each phase of your game, Increment countTest Before Checking isEndGame,adjusting isEndGame method ... --- ios/FlankerNativeComponents/GameManager.swift | 345 ++++++++++-------- 1 file changed, 197 insertions(+), 148 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index d8db36ca7..a099bfc8a 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -16,7 +16,7 @@ enum SelectedButton { enum Constants { static let lowTimeInterval: TimeInterval = 0.5 - static let debounceInterval: TimeInterval = 0.25 + static let moreTimeInterval: TimeInterval = 3 static let blueColor: UIColor = UIColor(red: 37, green: 95, blue: 158) static let greenColor: UIColor = UIColor(red: 68, green: 133, blue: 87) static let redColor: UIColor = UIColor(red: 199, green: 20, blue: 20) @@ -26,7 +26,6 @@ enum Constants { static let bigFont: UIFont = .systemFont(ofSize: 50.0, weight: .bold) static let smallFont: UIFont = .systemFont(ofSize: 30.0, weight: .bold) static let tag: String = "trial" - static let trialTag: String = "html-button-response" } enum TypeTimeStamps { @@ -52,9 +51,8 @@ class GameManager { private var timerSetText: Timer? private var timeResponse: Timer? - private var debounceTimer: Timer? - private var countTest = 0 + private var countTest = -1 private var countAllGame = 0 private var correctAnswers = 0 @@ -72,9 +70,7 @@ class GameManager { private var endFeedbackTimestamp: Double? private var respondTouchButton: Double? - private var isFirst = true - private var inFeedback = false - private var clickedInCurrentBlock = false + private var hasRespondedInCurrentTrial = false private var gameParameters: ParameterModel? @@ -94,10 +90,10 @@ class GameManager { isShowFixations = parameters.showFixation isShowResults = parameters.showResults countAllGame = parameters.trials.count - updateButtonTitle() resultManager.cleanData() - countTest = 0 + countTest = -1 correctAnswers = 0 + arrayTimes = [] startLogicTimer() } @@ -106,75 +102,87 @@ class GameManager { setDefaultText(isFirst: true) } - func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { - if isStart { - switch type { - case .fixations: - startFixationsTimestamp = time - case .trial: - startTrialTimestamp = time - case .feedback: - startFeedbackTimestamp = time - case .response: - respondTouchButton = time - } - } else { - switch type { - case .fixations: - endFixationsTimestamp = time - case .trial: - endTrialTimestamp = time - case .feedback: - endFeedbackTimestamp = time - case .response: - respondTouchButton = time - } +func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { + if isStart { + switch type { + case .fixations: + startFixationsTimestamp = time + case .trial: + break + case .feedback: + startFeedbackTimestamp = time + case .response: + break + } + } else { + switch type { + case .fixations: + endFixationsTimestamp = time + case .trial: + endTrialTimestamp = time + case .feedback: + endFeedbackTimestamp = time + case .response: + break } } +} func checkedAnswer(button: SelectedButton) { - guard !inFeedback && !clickedInCurrentBlock else { return } - clickedInCurrentBlock = true + guard !hasRespondedInCurrentTrial else { return } + hasRespondedInCurrentTrial = true + respondTouchButton = CACurrentMediaTime() + setEndTimeViewingImage(time: respondTouchButton!, isStart: false, type: .response) invalidateTimers() - debounceTimer?.invalidate() - debounceTimer = Timer.scheduledTimer(withTimeInterval: 0.25, repeats: false) { [weak self] _ in - self?.processCheckedAnswer(button: button) - } - } - - private func processCheckedAnswer(button: SelectedButton) { delegate?.setEnableButton(isEnable: false) guard let gameParameters = gameParameters else { return } - guard - let startTrialTimestamp = startTrialTimestamp, - let respondTouchButton = respondTouchButton - else { return } + guard let startTrialTimestamp = startTrialTimestamp else { return } + var resultTime = (respondTouchButton! - startTrialTimestamp) * 1000 - let resultTime = (respondTouchButton - startTrialTimestamp) * 1000 - arrayTimes.append(resultTime.convertToInt()) + if resultTime < 0 { + resultTime = 0 + } + + arrayTimes.append(Int(resultTime)) delegate?.updateTime(time: String(format: "%.3f", resultTime)) - let correctChoice = (button == .left && gameParameters.trials[countTest].correctChoice == 0) || - (button == .right && gameParameters.trials[countTest].correctChoice == 1) - - if correctChoice { + endTrialTimestamp = respondTouchButton + setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) + + startFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) + + let correctChoice = gameParameters.trials[countTest].correctChoice + let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) + if isCorrect { correctAnswers += 1 - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.correctText, color: Constants.greenColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } - responseText = Constants.correctText - } else { - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.inCorrectText, color: Constants.redColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } - responseText = Constants.inCorrectText } + let buttonPressed = (button == .left) ? "0" : "1" + let model = FlankerModel( + rt: resultTime, + stimulus: text, + button_pressed: buttonPressed, + image_time: endTrialTimestamp! * 1000, + correct: isCorrect, + start_timestamp: 0, + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: respondTouchButton! * 1000 + ) + + resultManager.addStepData(data: model) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + if gameParameters.showFeedback { - inFeedback = true - Timer.scheduledTimer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText + let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor + delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) } else { setDefaultText(isFirst: false) } @@ -183,27 +191,32 @@ class GameManager { @objc func setDefaultText(isFirst: Bool) { guard let gameParameters = gameParameters else { return } - inFeedback = false - clickedInCurrentBlock = false + hasRespondedInCurrentTrial = false + delegate?.setEnableButton(isEnable: false) if !isFirst { + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) countTest += 1 + } else { + countTest = 0 } - if gameParameters.showFixation { - if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { - delegate?.updateFixations(image: image, isStart: false, typeTime: .fixations) - } else { - delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: false, typeTime: .fixations) - } + if isEndGame() { + handleEndOfGame() + return } - if isEndGame() { return } - invalidateTimers() updateButtonTitle() if gameParameters.showFixation { - delegate?.setEnableButton(isEnable: false) + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) + + if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) + } else { + delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) + } timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) RunLoop.main.add(timerSetText!, forMode: .common) } else { @@ -213,6 +226,15 @@ class GameManager { @objc func setText() { guard let gameParameters = gameParameters else { return } + guard countTest < gameParameters.trials.count else { + handleEndOfGame() + return + } + + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) + + startTrialTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startTrialTimestamp!, isStart: true, type: .trial) text = gameParameters.trials[countTest].stimulus.en @@ -222,109 +244,136 @@ class GameManager { delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) } - delegate?.setEnableButton(isEnable: true) - timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(timeResponseFailed), userInfo: nil, repeats: false) - RunLoop.main.add(timeResponse!, forMode: .common) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + self.delegate?.setEnableButton(isEnable: true) + self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) + RunLoop.main.add(self.timeResponse!, forMode: .common) + } } @objc func timeResponseFailed() { guard let gameParameters = gameParameters else { return } delegate?.setEnableButton(isEnable: false) - delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) - - guard - let startTrialTimestamp = startTrialTimestamp, - let endTrialTimestamp = endTrialTimestamp - else { return } - - let model = FlankerModel(rt: 0.0, - stimulus: text, - button_pressed: nil, - image_time: endTrialTimestamp * 1000, // має намалювати - correct: false, - start_timestamp: 0, // вже намальовано - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: 0) + + endTrialTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) + + startFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) + + if gameParameters.showFeedback { + delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } + + guard let startTrialTimestamp = startTrialTimestamp else { return } + + let model = FlankerModel( + rt: 0.0, + stimulus: text, + button_pressed: nil, + image_time: endTrialTimestamp! * 1000, // має намалювати + correct: false, + start_timestamp: 0, // вже намальовано + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: 0 + ) resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - responseText = Constants.timeRespondText + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + + if gameParameters.showFeedback { + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) + } else { + setDefaultText(isFirst: false) + } + } + + func handleEndOfGame() { + guard let gameParameters = gameParameters else { return } + + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) + + let sumArray = arrayTimes.reduce(0, +) + let avrgArray = arrayTimes.count > 0 ? sumArray / arrayTimes.count : 0 + let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 + + clearData() + + delegate?.updateText(text: "Game Over", color: .black, font: Constants.bigFont, isStart: false, typeTime: .feedback) + + delegate?.setEnableButton(isEnable: false) - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(self.setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) + delegate?.resultTest( + avrgTime: avrgArray, + procentCorrect: Int(procentsCorrect), + data: nil, + dataArray: resultManager.oneGameDataResult, + isShowResults: gameParameters.showResults, + minAccuracy: gameParameters.minimumAccuracy + ) + } + + func isEndGame() -> Bool { + guard let gameParameters = gameParameters else { return false } + return countTest >= gameParameters.trials.count } func clearData() { resultManager.cleanData() - countTest = 0 + countTest = -1 correctAnswers = 0 arrayTimes = [] invalidateTimers() } - private func invalidateTimers() { + func invalidateTimers() { timeResponse?.invalidate() timerSetText?.invalidate() - debounceTimer?.invalidate() } - - private func updateButtonTitle() { +} + +private extension GameManager { + func updateButtonTitle() { guard let gameParameters = gameParameters else { return } + guard countTest < gameParameters.trials.count else { return } - if gameParameters.trials[countTest].choices.count == 2 { - if - let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), - let rightImage = URL(string: gameParameters.trials[countTest].choices[1].name.en), - gameParameters.trials[countTest].choices[0].name.en.contains("https"), - gameParameters.trials[countTest].choices[1].name.en.contains("https") { - delegate?.updateTitleButton(left: nil, right: nil, leftImage: leftImage, rightImage: rightImage, countButton: 2) - } - else if - let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), - gameParameters.trials[countTest].choices[0].name.en.contains("https"), - !gameParameters.trials[countTest].choices[1].name.en.contains("https") { - delegate?.updateTitleButton(left: nil, right: gameParameters.trials[countTest].choices[1].name.en, leftImage: leftImage, rightImage: nil, countButton: 2) - } - else if - let rightImage = URL(string: gameParameters.trials[countTest].choices[1].name.en), - gameParameters.trials[countTest].choices[1].name.en.contains("https"), - !gameParameters.trials[countTest].choices[0].name.en.contains("https") { - delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: nil, leftImage: nil, rightImage: rightImage, countButton: 2) - } - else { - delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: gameParameters.trials[countTest].choices[1].name.en, leftImage: nil, rightImage: nil, countButton: 2) - } - } else { - if - let leftImage = URL(string: gameParameters.trials[countTest].choices[0].name.en), - gameParameters.trials[countTest].choices[0].name.en.contains("https") { - delegate?.updateTitleButton(left: nil, right: nil, leftImage: leftImage, rightImage: nil, countButton: 1) + let choices = gameParameters.trials[countTest].choices + let countButton = choices.count + + var leftTitle: String? = nil + var rightTitle: String? = nil + var leftImage: URL? = nil + var rightImage: URL? = nil + + if countButton >= 1 { + let leftChoice = choices[0].name.en + if let url = URL(string: leftChoice), leftChoice.contains("https") { + leftImage = url } else { - delegate?.updateTitleButton(left: gameParameters.trials[countTest].choices[0].name.en, right: nil, leftImage: nil, rightImage: nil, countButton: 1) + leftTitle = leftChoice } } - } - private func isEndGame() -> Bool { - guard let gameParameters = gameParameters else { return false } - if countTest == gameParameters.trials.count { - let sumArray = arrayTimes.reduce(0, +) - var avrgArray: Int = 0 - if arrayTimes.count != 0 { - avrgArray = sumArray / arrayTimes.count - } - let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 - if !gameParameters.showFixation { - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) + if countButton == 2 { + let rightChoice = choices[1].name.en + if let url = URL(string: rightChoice), rightChoice.contains("https") { + rightImage = url + } else { + rightTitle = rightChoice } - delegate?.resultTest(avrgTime: avrgArray, procentCorrect: Int(procentsCorrect), data: nil, dataArray: resultManager.oneGameDataResult, isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) - clearData() - return true - } else { - return false } + + delegate?.updateTitleButton( + left: leftTitle, + right: rightTitle, + leftImage: leftImage, + rightImage: rightImage, + countButton: countButton + ) } } From 86efa2f86aebcc72fe60bf8d104f156cb61cdd00 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 5 Nov 2024 15:09:14 -0800 Subject: [PATCH 13/30] fixing identation --- ios/FlankerNativeComponents/GameManager.swift | 698 +++++++++--------- 1 file changed, 349 insertions(+), 349 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index a099bfc8a..f396e46f7 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -15,365 +15,365 @@ enum SelectedButton { } enum Constants { - static let lowTimeInterval: TimeInterval = 0.5 - static let moreTimeInterval: TimeInterval = 3 - static let blueColor: UIColor = UIColor(red: 37, green: 95, blue: 158) - static let greenColor: UIColor = UIColor(red: 68, green: 133, blue: 87) - static let redColor: UIColor = UIColor(red: 199, green: 20, blue: 20) - static let correctText: String = "Correct!" - static let inCorrectText: String = "Incorrect" - static let timeRespondText: String = "Respond faster" - static let bigFont: UIFont = .systemFont(ofSize: 50.0, weight: .bold) - static let smallFont: UIFont = .systemFont(ofSize: 30.0, weight: .bold) - static let tag: String = "trial" + static let lowTimeInterval: TimeInterval = 0.5 + static let moreTimeInterval: TimeInterval = 3 + static let blueColor: UIColor = UIColor(red: 37, green: 95, blue: 158) + static let greenColor: UIColor = UIColor(red: 68, green: 133, blue: 87) + static let redColor: UIColor = UIColor(red: 199, green: 20, blue: 20) + static let correctText: String = "Correct!" + static let inCorrectText: String = "Incorrect" + static let timeRespondText: String = "Respond faster" + static let bigFont: UIFont = .systemFont(ofSize: 50.0, weight: .bold) + static let smallFont: UIFont = .systemFont(ofSize: 30.0, weight: .bold) + static let tag: String = "trial" } enum TypeTimeStamps { - case fixations - case trial - case feedback - case response + case fixations + case trial + case feedback + case response } protocol GameManagerProtocol: AnyObject { - func updateText(text: String, color: UIColor, font: UIFont, isStart: Bool, typeTime: TypeTimeStamps) - func updateFixations(image: URL?, isStart: Bool, typeTime: TypeTimeStamps) - func updateTime(time: String) - func setEnableButton(isEnable: Bool) - func updateTitleButton(left: String?, right: String?, leftImage: URL?, rightImage: URL?, countButton: Int) - func resultTest(avrgTime: Int?, procentCorrect: Int?, data: FlankerModel?, dataArray: [FlankerModel]?, isShowResults: Bool, minAccuracy: Int) + func updateText(text: String, color: UIColor, font: UIFont, isStart: Bool, typeTime: TypeTimeStamps) + func updateFixations(image: URL?, isStart: Bool, typeTime: TypeTimeStamps) + func updateTime(time: String) + func setEnableButton(isEnable: Bool) + func updateTitleButton(left: String?, right: String?, leftImage: URL?, rightImage: URL?, countButton: Int) + func resultTest(avrgTime: Int?, procentCorrect: Int?, data: FlankerModel?, dataArray: [FlankerModel]?, isShowResults: Bool, minAccuracy: Int) } class GameManager { - private let resultManager = ResultManager.shared - private var text: String = "" - private var responseText: String = "" - - private var timerSetText: Timer? - private var timeResponse: Timer? - - private var countTest = -1 - private var countAllGame = 0 - private var correctAnswers = 0 - - private var timeSpeedGame: TimeInterval = 0.5 - private var isShowFeedback = true - private var isShowFixations = true - private var isShowResults = true - private var arrayTimes: [Int] = [] - - private var startFixationsTimestamp: Double? - private var endFixationsTimestamp: Double? - private var startTrialTimestamp: Double? - private var endTrialTimestamp: Double? - private var startFeedbackTimestamp: Double? - private var endFeedbackTimestamp: Double? - private var respondTouchButton: Double? - - private var hasRespondedInCurrentTrial = false - - private var gameParameters: ParameterModel? - - weak var delegate: GameManagerProtocol? - - func startGame(timeSpeed: Float, isShowAnswers: Bool, countGame: Int) { - countAllGame = countGame - timeSpeedGame = TimeInterval(timeSpeed) - isShowFeedback = isShowAnswers - startLogicTimer() - } - - func parameterGame() { - guard let parameters = ParameterGameManager.shared.getParameters() else { return } - gameParameters = parameters - isShowFeedback = parameters.showFeedback - isShowFixations = parameters.showFixation - isShowResults = parameters.showResults - countAllGame = parameters.trials.count - resultManager.cleanData() - countTest = -1 - correctAnswers = 0 - arrayTimes = [] - startLogicTimer() - } - - func startLogicTimer() { - invalidateTimers() - setDefaultText(isFirst: true) - } - -func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { - if isStart { - switch type { - case .fixations: - startFixationsTimestamp = time - case .trial: - break - case .feedback: - startFeedbackTimestamp = time - case .response: - break - } - } else { - switch type { - case .fixations: - endFixationsTimestamp = time - case .trial: - endTrialTimestamp = time - case .feedback: - endFeedbackTimestamp = time - case .response: - break - } - } -} - - func checkedAnswer(button: SelectedButton) { - guard !hasRespondedInCurrentTrial else { return } - hasRespondedInCurrentTrial = true - respondTouchButton = CACurrentMediaTime() - setEndTimeViewingImage(time: respondTouchButton!, isStart: false, type: .response) - invalidateTimers() - - delegate?.setEnableButton(isEnable: false) - - guard let gameParameters = gameParameters else { return } - guard let startTrialTimestamp = startTrialTimestamp else { return } - var resultTime = (respondTouchButton! - startTrialTimestamp) * 1000 - - if resultTime < 0 { - resultTime = 0 - } - - arrayTimes.append(Int(resultTime)) - delegate?.updateTime(time: String(format: "%.3f", resultTime)) - - endTrialTimestamp = respondTouchButton - setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) - - startFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) - - let correctChoice = gameParameters.trials[countTest].correctChoice - let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) - if isCorrect { - correctAnswers += 1 - } - - let buttonPressed = (button == .left) ? "0" : "1" - let model = FlankerModel( - rt: resultTime, - stimulus: text, - button_pressed: buttonPressed, - image_time: endTrialTimestamp! * 1000, - correct: isCorrect, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton! * 1000 - ) - - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) - - if gameParameters.showFeedback { - let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText - let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor - delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) - } else { - setDefaultText(isFirst: false) - } - } - - @objc func setDefaultText(isFirst: Bool) { - guard let gameParameters = gameParameters else { return } - - hasRespondedInCurrentTrial = false - delegate?.setEnableButton(isEnable: false) - - if !isFirst { - endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) - countTest += 1 - } else { - countTest = 0 - } - - if isEndGame() { - handleEndOfGame() - return - } - - updateButtonTitle() - - if gameParameters.showFixation { - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) - - if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) - } else { - delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) - } - timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) - RunLoop.main.add(timerSetText!, forMode: .common) - } else { - setText() - } - } - - @objc func setText() { - guard let gameParameters = gameParameters else { return } - guard countTest < gameParameters.trials.count else { - handleEndOfGame() - return - } - - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) - - startTrialTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startTrialTimestamp!, isStart: true, type: .trial) - - text = gameParameters.trials[countTest].stimulus.en - - if let image = URL(string: text), text.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) - } else { - delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) - } - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - self.delegate?.setEnableButton(isEnable: true) - self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) - RunLoop.main.add(self.timeResponse!, forMode: .common) - } - } - - @objc func timeResponseFailed() { - guard let gameParameters = gameParameters else { return } - - delegate?.setEnableButton(isEnable: false) - - endTrialTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) - - startFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) - - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } - - guard let startTrialTimestamp = startTrialTimestamp else { return } - - let model = FlankerModel( - rt: 0.0, - stimulus: text, - button_pressed: nil, - image_time: endTrialTimestamp! * 1000, // має намалювати - correct: false, - start_timestamp: 0, // вже намальовано - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: 0 - ) - - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) - - if gameParameters.showFeedback { - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) - } else { - setDefaultText(isFirst: false) - } - } - - func handleEndOfGame() { - guard let gameParameters = gameParameters else { return } - - endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) - - let sumArray = arrayTimes.reduce(0, +) - let avrgArray = arrayTimes.count > 0 ? sumArray / arrayTimes.count : 0 - let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 - - clearData() - - delegate?.updateText(text: "Game Over", color: .black, font: Constants.bigFont, isStart: false, typeTime: .feedback) - - delegate?.setEnableButton(isEnable: false) - - delegate?.resultTest( - avrgTime: avrgArray, - procentCorrect: Int(procentsCorrect), - data: nil, - dataArray: resultManager.oneGameDataResult, - isShowResults: gameParameters.showResults, - minAccuracy: gameParameters.minimumAccuracy - ) - } - - func isEndGame() -> Bool { - guard let gameParameters = gameParameters else { return false } - return countTest >= gameParameters.trials.count - } - - func clearData() { - resultManager.cleanData() - countTest = -1 - correctAnswers = 0 - arrayTimes = [] - invalidateTimers() - } - - func invalidateTimers() { - timeResponse?.invalidate() - timerSetText?.invalidate() - } + private let resultManager = ResultManager.shared + private var text: String = "" + private var responseText: String = "" + + private var timerSetText: Timer? + private var timeResponse: Timer? + + private var countTest = -1 + private var countAllGame = 0 + private var correctAnswers = 0 + + private var timeSpeedGame: TimeInterval = 0.5 + private var isShowFeedback = true + private var isShowFixations = true + private var isShowResults = true + private var arrayTimes: [Int] = [] + + private var startFixationsTimestamp: Double? + private var endFixationsTimestamp: Double? + private var startTrialTimestamp: Double? + private var endTrialTimestamp: Double? + private var startFeedbackTimestamp: Double? + private var endFeedbackTimestamp: Double? + private var respondTouchButton: Double? + + private var hasRespondedInCurrentTrial = false + + private var gameParameters: ParameterModel? + + weak var delegate: GameManagerProtocol? + + func startGame(timeSpeed: Float, isShowAnswers: Bool, countGame: Int) { + countAllGame = countGame + timeSpeedGame = TimeInterval(timeSpeed) + isShowFeedback = isShowAnswers + startLogicTimer() + } + + func parameterGame() { + guard let parameters = ParameterGameManager.shared.getParameters() else { return } + gameParameters = parameters + isShowFeedback = parameters.showFeedback + isShowFixations = parameters.showFixation + isShowResults = parameters.showResults + countAllGame = parameters.trials.count + resultManager.cleanData() + countTest = -1 + correctAnswers = 0 + arrayTimes = [] + startLogicTimer() + } + + func startLogicTimer() { + invalidateTimers() + setDefaultText(isFirst: true) + } + + func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { + if isStart { + switch type { + case .fixations: + startFixationsTimestamp = time + case .trial: + break + case .feedback: + startFeedbackTimestamp = time + case .response: + break + } + } else { + switch type { + case .fixations: + endFixationsTimestamp = time + case .trial: + endTrialTimestamp = time + case .feedback: + endFeedbackTimestamp = time + case .response: + break + } + } + } + + func checkedAnswer(button: SelectedButton) { + guard !hasRespondedInCurrentTrial else { return } + hasRespondedInCurrentTrial = true + respondTouchButton = CACurrentMediaTime() + setEndTimeViewingImage(time: respondTouchButton!, isStart: false, type: .response) + invalidateTimers() + + delegate?.setEnableButton(isEnable: false) + + guard let gameParameters = gameParameters else { return } + guard let startTrialTimestamp = startTrialTimestamp else { return } + var resultTime = (respondTouchButton! - startTrialTimestamp) * 1000 + + if resultTime < 0 { + resultTime = 0 + } + + arrayTimes.append(Int(resultTime)) + delegate?.updateTime(time: String(format: "%.3f", resultTime)) + + endTrialTimestamp = respondTouchButton + setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) + + startFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) + + let correctChoice = gameParameters.trials[countTest].correctChoice + let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) + if isCorrect { + correctAnswers += 1 + } + + let buttonPressed = (button == .left) ? "0" : "1" + let model = FlankerModel( + rt: resultTime, + stimulus: text, + button_pressed: buttonPressed, + image_time: endTrialTimestamp! * 1000, + correct: isCorrect, + start_timestamp: 0, + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: respondTouchButton! * 1000 + ) + + resultManager.addStepData(data: model) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + + if gameParameters.showFeedback { + let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText + let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor + delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) + } else { + setDefaultText(isFirst: false) + } + } + + @objc func setDefaultText(isFirst: Bool) { + guard let gameParameters = gameParameters else { return } + + hasRespondedInCurrentTrial = false + delegate?.setEnableButton(isEnable: false) + + if !isFirst { + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) + countTest += 1 + } else { + countTest = 0 + } + + if isEndGame() { + handleEndOfGame() + return + } + + updateButtonTitle() + + if gameParameters.showFixation { + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) + + if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) + } else { + delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) + } + timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) + RunLoop.main.add(timerSetText!, forMode: .common) + } else { + setText() + } + } + + @objc func setText() { + guard let gameParameters = gameParameters else { return } + guard countTest < gameParameters.trials.count else { + handleEndOfGame() + return + } + + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) + + startTrialTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startTrialTimestamp!, isStart: true, type: .trial) + + text = gameParameters.trials[countTest].stimulus.en + + if let image = URL(string: text), text.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) + } else { + delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + self.delegate?.setEnableButton(isEnable: true) + self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) + RunLoop.main.add(self.timeResponse!, forMode: .common) + } + } + + @objc func timeResponseFailed() { + guard let gameParameters = gameParameters else { return } + + delegate?.setEnableButton(isEnable: false) + + endTrialTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) + + startFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) + + if gameParameters.showFeedback { + delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } + + guard let startTrialTimestamp = startTrialTimestamp else { return } + + let model = FlankerModel( + rt: 0.0, + stimulus: text, + button_pressed: nil, + image_time: endTrialTimestamp! * 1000, // має намалювати + correct: false, + start_timestamp: 0, // вже намальовано + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: 0 + ) + + resultManager.addStepData(data: model) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + + if gameParameters.showFeedback { + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) + } else { + setDefaultText(isFirst: false) + } + } + + func handleEndOfGame() { + guard let gameParameters = gameParameters else { return } + + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) + + let sumArray = arrayTimes.reduce(0, +) + let avrgArray = arrayTimes.count > 0 ? sumArray / arrayTimes.count : 0 + let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 + + clearData() + + delegate?.updateText(text: "Game Over", color: .black, font: Constants.bigFont, isStart: false, typeTime: .feedback) + + delegate?.setEnableButton(isEnable: false) + + delegate?.resultTest( + avrgTime: avrgArray, + procentCorrect: Int(procentsCorrect), + data: nil, + dataArray: resultManager.oneGameDataResult, + isShowResults: gameParameters.showResults, + minAccuracy: gameParameters.minimumAccuracy + ) + } + + func isEndGame() -> Bool { + guard let gameParameters = gameParameters else { return false } + return countTest >= gameParameters.trials.count + } + + func clearData() { + resultManager.cleanData() + countTest = -1 + correctAnswers = 0 + arrayTimes = [] + invalidateTimers() + } + + func invalidateTimers() { + timeResponse?.invalidate() + timerSetText?.invalidate() + } } private extension GameManager { - func updateButtonTitle() { - guard let gameParameters = gameParameters else { return } - guard countTest < gameParameters.trials.count else { return } - - let choices = gameParameters.trials[countTest].choices - let countButton = choices.count - - var leftTitle: String? = nil - var rightTitle: String? = nil - var leftImage: URL? = nil - var rightImage: URL? = nil - - if countButton >= 1 { - let leftChoice = choices[0].name.en - if let url = URL(string: leftChoice), leftChoice.contains("https") { - leftImage = url - } else { - leftTitle = leftChoice - } - } - - if countButton == 2 { - let rightChoice = choices[1].name.en - if let url = URL(string: rightChoice), rightChoice.contains("https") { - rightImage = url - } else { - rightTitle = rightChoice - } - } - - delegate?.updateTitleButton( - left: leftTitle, - right: rightTitle, - leftImage: leftImage, - rightImage: rightImage, - countButton: countButton - ) - } + func updateButtonTitle() { + guard let gameParameters = gameParameters else { return } + guard countTest < gameParameters.trials.count else { return } + + let choices = gameParameters.trials[countTest].choices + let countButton = choices.count + + var leftTitle: String? = nil + var rightTitle: String? = nil + var leftImage: URL? = nil + var rightImage: URL? = nil + + if countButton >= 1 { + let leftChoice = choices[0].name.en + if let url = URL(string: leftChoice), leftChoice.contains("https") { + leftImage = url + } else { + leftTitle = leftChoice + } + } + + if countButton == 2 { + let rightChoice = choices[1].name.en + if let url = URL(string: rightChoice), rightChoice.contains("https") { + rightImage = url + } else { + rightTitle = rightChoice + } + } + + delegate?.updateTitleButton( + left: leftTitle, + right: rightTitle, + leftImage: leftImage, + rightImage: rightImage, + countButton: countButton + ) + } } From 6bf03abb3c5b5325922f4eaef3b9b8bc4efcb7d7 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 5 Nov 2024 15:12:50 -0800 Subject: [PATCH 14/30] fixing identation --- ios/FlankerNativeComponents/GameManager.swift | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index f396e46f7..9e95156d0 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -10,8 +10,8 @@ import Foundation import UIKit enum SelectedButton { - case left - case right + case left + case right } enum Constants { @@ -46,6 +46,7 @@ protocol GameManagerProtocol: AnyObject { class GameManager { private let resultManager = ResultManager.shared + private var text: String = "" private var responseText: String = "" @@ -77,29 +78,29 @@ class GameManager { weak var delegate: GameManagerProtocol? func startGame(timeSpeed: Float, isShowAnswers: Bool, countGame: Int) { - countAllGame = countGame - timeSpeedGame = TimeInterval(timeSpeed) - isShowFeedback = isShowAnswers - startLogicTimer() + countAllGame = countGame + timeSpeedGame = TimeInterval(timeSpeed) + isShowFeedback = isShowAnswers + startLogicTimer() } func parameterGame() { - guard let parameters = ParameterGameManager.shared.getParameters() else { return } - gameParameters = parameters - isShowFeedback = parameters.showFeedback - isShowFixations = parameters.showFixation - isShowResults = parameters.showResults - countAllGame = parameters.trials.count - resultManager.cleanData() - countTest = -1 - correctAnswers = 0 - arrayTimes = [] - startLogicTimer() + guard let parameters = ParameterGameManager.shared.getParameters() else { return } + gameParameters = parameters + isShowFeedback = parameters.showFeedback + isShowFixations = parameters.showFixation + isShowResults = parameters.showResults + countAllGame = parameters.trials.count + resultManager.cleanData() + countTest = -1 + correctAnswers = 0 + arrayTimes = [] + startLogicTimer() } func startLogicTimer() { - invalidateTimers() - setDefaultText(isFirst: true) + invalidateTimers() + setDefaultText(isFirst: true) } func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { From 4308079e4b6bc3d700e6b1a31647841eff0896f4 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Tue, 5 Nov 2024 15:17:51 -0800 Subject: [PATCH 15/30] fixing setEndTimeViewingImage indentation --- ios/FlankerNativeComponents/GameManager.swift | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 9e95156d0..1e099154a 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -104,29 +104,29 @@ class GameManager { } func setEndTimeViewingImage(time: Double, isStart: Bool, type: TypeTimeStamps) { - if isStart { - switch type { - case .fixations: - startFixationsTimestamp = time - case .trial: - break - case .feedback: - startFeedbackTimestamp = time - case .response: - break - } - } else { - switch type { - case .fixations: - endFixationsTimestamp = time - case .trial: - endTrialTimestamp = time - case .feedback: - endFeedbackTimestamp = time - case .response: - break - } + if isStart { + switch type { + case .fixations: + startFixationsTimestamp = time + case .trial: + break + case .feedback: + startFeedbackTimestamp = time + case .response: + break + } + } else { + switch type { + case .fixations: + endFixationsTimestamp = time + case .trial: + endTrialTimestamp = time + case .feedback: + endFeedbackTimestamp = time + case .response: + break } + } } func checkedAnswer(button: SelectedButton) { From 7e3d04a9b886d559874d62eaf3a6d3c4f60f5c90 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 6 Nov 2024 11:39:57 -0800 Subject: [PATCH 16/30] fixing clear data indentation and handleEndOfGame indentation --- ios/FlankerNativeComponents/GameManager.swift | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 1e099154a..a294e6de8 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -294,47 +294,47 @@ class GameManager { } func handleEndOfGame() { - guard let gameParameters = gameParameters else { return } + guard let gameParameters = gameParameters else { return } - endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) - let sumArray = arrayTimes.reduce(0, +) - let avrgArray = arrayTimes.count > 0 ? sumArray / arrayTimes.count : 0 - let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 + let sumArray = arrayTimes.reduce(0, +) + let avrgArray = arrayTimes.count > 0 ? sumArray / arrayTimes.count : 0 + let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 - clearData() + clearData() - delegate?.updateText(text: "Game Over", color: .black, font: Constants.bigFont, isStart: false, typeTime: .feedback) + delegate?.updateText(text: "Game Over", color: .black, font: Constants.bigFont, isStart: false, typeTime: .feedback) - delegate?.setEnableButton(isEnable: false) + delegate?.setEnableButton(isEnable: false) - delegate?.resultTest( - avrgTime: avrgArray, - procentCorrect: Int(procentsCorrect), - data: nil, - dataArray: resultManager.oneGameDataResult, - isShowResults: gameParameters.showResults, - minAccuracy: gameParameters.minimumAccuracy - ) + delegate?.resultTest( + avrgTime: avrgArray, + procentCorrect: Int(procentsCorrect), + data: nil, + dataArray: resultManager.oneGameDataResult, + isShowResults: gameParameters.showResults, + minAccuracy: gameParameters.minimumAccuracy + ) } func isEndGame() -> Bool { - guard let gameParameters = gameParameters else { return false } - return countTest >= gameParameters.trials.count + guard let gameParameters = gameParameters else { return false } + return countTest >= gameParameters.trials.count } func clearData() { - resultManager.cleanData() - countTest = -1 - correctAnswers = 0 - arrayTimes = [] - invalidateTimers() + resultManager.cleanData() + countTest = -1 + correctAnswers = 0 + arrayTimes = [] + invalidateTimers() } func invalidateTimers() { - timeResponse?.invalidate() - timerSetText?.invalidate() + timeResponse?.invalidate() + timerSetText?.invalidate() } } From 0f10999301e355e42b087c2fae83837d8c39aeb3 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 7 Nov 2024 09:09:20 -0800 Subject: [PATCH 17/30] fixing setEntiTimeViewingImage and CheckAnser Indentation --- ios/FlankerNativeComponents/GameManager.swift | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index a294e6de8..301b355a1 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -107,13 +107,13 @@ class GameManager { if isStart { switch type { case .fixations: - startFixationsTimestamp = time + startFixationsTimestamp = time case .trial: break case .feedback: - startFeedbackTimestamp = time + startFeedbackTimestamp = time case .response: - break + break } } else { switch type { @@ -130,60 +130,60 @@ class GameManager { } func checkedAnswer(button: SelectedButton) { - guard !hasRespondedInCurrentTrial else { return } - hasRespondedInCurrentTrial = true - respondTouchButton = CACurrentMediaTime() - setEndTimeViewingImage(time: respondTouchButton!, isStart: false, type: .response) - invalidateTimers() + guard !hasRespondedInCurrentTrial else { return } + hasRespondedInCurrentTrial = true + respondTouchButton = CACurrentMediaTime() + setEndTimeViewingImage(time: respondTouchButton!, isStart: false, type: .response) + invalidateTimers() - delegate?.setEnableButton(isEnable: false) + delegate?.setEnableButton(isEnable: false) - guard let gameParameters = gameParameters else { return } - guard let startTrialTimestamp = startTrialTimestamp else { return } - var resultTime = (respondTouchButton! - startTrialTimestamp) * 1000 + guard let gameParameters = gameParameters else { return } + guard let startTrialTimestamp = startTrialTimestamp else { return } + var resultTime = (respondTouchButton! - startTrialTimestamp) * 1000 - if resultTime < 0 { - resultTime = 0 - } + if resultTime < 0 { + resultTime = 0 + } - arrayTimes.append(Int(resultTime)) - delegate?.updateTime(time: String(format: "%.3f", resultTime)) + arrayTimes.append(Int(resultTime)) + delegate?.updateTime(time: String(format: "%.3f", resultTime)) - endTrialTimestamp = respondTouchButton - setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) + endTrialTimestamp = respondTouchButton + setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) - startFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) + startFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) - let correctChoice = gameParameters.trials[countTest].correctChoice - let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) - if isCorrect { - correctAnswers += 1 - } + let correctChoice = gameParameters.trials[countTest].correctChoice + let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) + if isCorrect { + correctAnswers += 1 + } - let buttonPressed = (button == .left) ? "0" : "1" - let model = FlankerModel( - rt: resultTime, - stimulus: text, - button_pressed: buttonPressed, - image_time: endTrialTimestamp! * 1000, - correct: isCorrect, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton! * 1000 - ) + let buttonPressed = (button == .left) ? "0" : "1" + let model = FlankerModel( + rt: resultTime, + stimulus: text, + button_pressed: buttonPressed, + image_time: endTrialTimestamp! * 1000, + correct: isCorrect, + start_timestamp: 0, + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: respondTouchButton! * 1000 + ) - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + resultManager.addStepData(data: model) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) - if gameParameters.showFeedback { - let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText - let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor - delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) + if gameParameters.showFeedback { + let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText + let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor + delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) } else { setDefaultText(isFirst: false) } From b0accf50cda177d52e5b150b417893de74176d9e Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 7 Nov 2024 09:11:11 -0800 Subject: [PATCH 18/30] fixing the else of setEntiTimeViewingImage indentation --- ios/FlankerNativeComponents/GameManager.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 301b355a1..4c2f831bb 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -118,13 +118,13 @@ class GameManager { } else { switch type { case .fixations: - endFixationsTimestamp = time + endFixationsTimestamp = time case .trial: - endTrialTimestamp = time + endTrialTimestamp = time case .feedback: - endFeedbackTimestamp = time + endFeedbackTimestamp = time case .response: - break + break } } } From 4c35edf776547ba6096b7b72403217e03511aa90 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 7 Nov 2024 09:13:33 -0800 Subject: [PATCH 19/30] fixin timeResponseFailed indentation --- ios/FlankerNativeComponents/GameManager.swift | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 4c2f831bb..80526ab63 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -253,44 +253,44 @@ class GameManager { } @objc func timeResponseFailed() { - guard let gameParameters = gameParameters else { return } + guard let gameParameters = gameParameters else { return } - delegate?.setEnableButton(isEnable: false) + delegate?.setEnableButton(isEnable: false) - endTrialTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) + endTrialTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) - startFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) + startFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) - if gameParameters.showFeedback { - delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) - } + if gameParameters.showFeedback { + delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + } - guard let startTrialTimestamp = startTrialTimestamp else { return } - - let model = FlankerModel( - rt: 0.0, - stimulus: text, - button_pressed: nil, - image_time: endTrialTimestamp! * 1000, // має намалювати - correct: false, - start_timestamp: 0, // вже намальовано - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: 0 - ) + guard let startTrialTimestamp = startTrialTimestamp else { return } - resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + let model = FlankerModel( + rt: 0.0, + stimulus: text, + button_pressed: nil, + image_time: endTrialTimestamp! * 1000, // має намалювати + correct: false, + start_timestamp: 0, // вже намальовано + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: 0 + ) - if gameParameters.showFeedback { - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) - } else { - setDefaultText(isFirst: false) - } + resultManager.addStepData(data: model) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + + if gameParameters.showFeedback { + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) + } else { + setDefaultText(isFirst: false) + } } func handleEndOfGame() { From 3c1cf6e3c9b2d9898687538f2698c9f2a9d21309 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 7 Nov 2024 09:15:05 -0800 Subject: [PATCH 20/30] fixing setDefaultText Indentation --- ios/FlankerNativeComponents/GameManager.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 80526ab63..184d969db 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -196,16 +196,16 @@ class GameManager { delegate?.setEnableButton(isEnable: false) if !isFirst { - endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) - countTest += 1 + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) + countTest += 1 } else { - countTest = 0 + countTest = 0 } if isEndGame() { - handleEndOfGame() - return + handleEndOfGame() + return } updateButtonTitle() @@ -214,14 +214,14 @@ class GameManager { setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) + delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) } else { - delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) + delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) } timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) RunLoop.main.add(timerSetText!, forMode: .common) } else { - setText() + setText() } } From 05c7d0cfe3138ce0a136f99f98ec92ffd179d573 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 15:55:37 -0800 Subject: [PATCH 21/30] fix/removing some redundances, removing endgame screen and fixing some indentations --- ios/FlankerNativeComponents/GameManager.swift | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 184d969db..77a7d20a2 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -133,7 +133,6 @@ class GameManager { guard !hasRespondedInCurrentTrial else { return } hasRespondedInCurrentTrial = true respondTouchButton = CACurrentMediaTime() - setEndTimeViewingImage(time: respondTouchButton!, isStart: false, type: .response) invalidateTimers() delegate?.setEnableButton(isEnable: false) @@ -142,10 +141,6 @@ class GameManager { guard let startTrialTimestamp = startTrialTimestamp else { return } var resultTime = (respondTouchButton! - startTrialTimestamp) * 1000 - if resultTime < 0 { - resultTime = 0 - } - arrayTimes.append(Int(resultTime)) delegate?.updateTime(time: String(format: "%.3f", resultTime)) @@ -235,7 +230,6 @@ class GameManager { setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) startTrialTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startTrialTimestamp!, isStart: true, type: .trial) text = gameParameters.trials[countTest].stimulus.en @@ -245,7 +239,7 @@ class GameManager { delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) } - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + DispatchQueue.main.asyncAfter(deadline: .now()) { self.delegate?.setEnableButton(isEnable: true) self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) RunLoop.main.add(self.timeResponse!, forMode: .common) @@ -258,10 +252,8 @@ class GameManager { delegate?.setEnableButton(isEnable: false) endTrialTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) startFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) if gameParameters.showFeedback { delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) @@ -269,21 +261,20 @@ class GameManager { guard let startTrialTimestamp = startTrialTimestamp else { return } - let model = FlankerModel( - rt: 0.0, - stimulus: text, - button_pressed: nil, - image_time: endTrialTimestamp! * 1000, // має намалювати - correct: false, - start_timestamp: 0, // вже намальовано - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: 0 - ) + let model = FlankerModel(rt: 0.0, + stimulus: text, + button_pressed: nil, + image_time: endTrialTimestamp! * 1000,// має намалювати + correct: false, + start_timestamp: 0,// вже намальовано + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: 0 + ) resultManager.addStepData(data: model) - delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) + delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil,isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) @@ -296,17 +287,12 @@ class GameManager { func handleEndOfGame() { guard let gameParameters = gameParameters else { return } - endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) - let sumArray = arrayTimes.reduce(0, +) let avrgArray = arrayTimes.count > 0 ? sumArray / arrayTimes.count : 0 let procentsCorrect = Float(correctAnswers) / Float(countAllGame) * 100 clearData() - delegate?.updateText(text: "Game Over", color: .black, font: Constants.bigFont, isStart: false, typeTime: .feedback) - delegate?.setEnableButton(isEnable: false) delegate?.resultTest( From 707c3bea1b11d24e2053fc9990115af8af05457a Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 15:59:50 -0800 Subject: [PATCH 22/30] removing additional space on comment --- ios/FlankerNativeComponents/GameManager.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 77a7d20a2..c3271fdf4 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -264,9 +264,9 @@ class GameManager { let model = FlankerModel(rt: 0.0, stimulus: text, button_pressed: nil, - image_time: endTrialTimestamp! * 1000,// має намалювати + image_time: endTrialTimestamp! * 1000, // має намалювати correct: false, - start_timestamp: 0,// вже намальовано + start_timestamp: 0, // вже намальовано tag: Constants.tag, trial_index: countTest + 1, start_time: startTrialTimestamp * 1000, From 43828c17e2774ec1957bd5e7e4c535a282d9c27b Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:03:21 -0800 Subject: [PATCH 23/30] fix/ fixing indentation of gameParameters.showFeedback --- ios/FlankerNativeComponents/GameManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index c3271fdf4..b0ed0cf0b 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -256,7 +256,7 @@ class GameManager { startFeedbackTimestamp = CACurrentMediaTime() if gameParameters.showFeedback { - delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) + delegate?.updateText(text: Constants.timeRespondText, color: .black, font: Constants.smallFont, isStart: false, typeTime: .feedback) } guard let startTrialTimestamp = startTrialTimestamp else { return } From 181c9f38010b8ba36a408e76f0b71d12dac9a711 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:05:38 -0800 Subject: [PATCH 24/30] fixing indentantion --- ios/FlankerNativeComponents/GameManager.swift | 174 +++++++++--------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index b0ed0cf0b..15b19a7ff 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -174,76 +174,76 @@ class GameManager { delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) if gameParameters.showFeedback { - let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText - let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor - delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) - let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) - RunLoop.main.add(timer, forMode: .common) - } else { - setDefaultText(isFirst: false) - } + let feedbackText = isCorrect ? Constants.correctText : Constants.inCorrectText + let feedbackColor = isCorrect ? Constants.greenColor : Constants.redColor + delegate?.updateText(text: feedbackText, color: feedbackColor, font: Constants.smallFont, isStart: false, typeTime: .feedback) + let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) + RunLoop.main.add(timer, forMode: .common) + } else { + setDefaultText(isFirst: false) + } } @objc func setDefaultText(isFirst: Bool) { - guard let gameParameters = gameParameters else { return } + guard let gameParameters = gameParameters else { return } - hasRespondedInCurrentTrial = false - delegate?.setEnableButton(isEnable: false) + hasRespondedInCurrentTrial = false + delegate?.setEnableButton(isEnable: false) - if !isFirst { - endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) - countTest += 1 - } else { - countTest = 0 - } + if !isFirst { + endFeedbackTimestamp = CACurrentMediaTime() + setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) + countTest += 1 + } else { + countTest = 0 + } - if isEndGame() { - handleEndOfGame() - return - } + if isEndGame() { + handleEndOfGame() + return + } - updateButtonTitle() + updateButtonTitle() - if gameParameters.showFixation { - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) + if gameParameters.showFixation { + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) - if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) - } else { - delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) - } - timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) - RunLoop.main.add(timerSetText!, forMode: .common) - } else { - setText() - } + if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) + } else { + delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) + } + timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) + RunLoop.main.add(timerSetText!, forMode: .common) + } else { + setText() + } } @objc func setText() { - guard let gameParameters = gameParameters else { return } - guard countTest < gameParameters.trials.count else { - handleEndOfGame() - return - } + guard let gameParameters = gameParameters else { return } + guard countTest < gameParameters.trials.count else { + handleEndOfGame() + return + } - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) - startTrialTimestamp = CACurrentMediaTime() + startTrialTimestamp = CACurrentMediaTime() - text = gameParameters.trials[countTest].stimulus.en + text = gameParameters.trials[countTest].stimulus.en - if let image = URL(string: text), text.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) - } else { - delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) - } + if let image = URL(string: text), text.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) + } else { + delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) + } - DispatchQueue.main.asyncAfter(deadline: .now()) { - self.delegate?.setEnableButton(isEnable: true) - self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) - RunLoop.main.add(self.timeResponse!, forMode: .common) - } + DispatchQueue.main.asyncAfter(deadline: .now()) { + self.delegate?.setEnableButton(isEnable: true) + self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) + RunLoop.main.add(self.timeResponse!, forMode: .common) + } } @objc func timeResponseFailed() { @@ -326,41 +326,41 @@ class GameManager { private extension GameManager { func updateButtonTitle() { - guard let gameParameters = gameParameters else { return } - guard countTest < gameParameters.trials.count else { return } - - let choices = gameParameters.trials[countTest].choices - let countButton = choices.count - - var leftTitle: String? = nil - var rightTitle: String? = nil - var leftImage: URL? = nil - var rightImage: URL? = nil - - if countButton >= 1 { - let leftChoice = choices[0].name.en - if let url = URL(string: leftChoice), leftChoice.contains("https") { - leftImage = url - } else { - leftTitle = leftChoice - } - } + guard let gameParameters = gameParameters else { return } + guard countTest < gameParameters.trials.count else { return } + + let choices = gameParameters.trials[countTest].choices + let countButton = choices.count + + var leftTitle: String? = nil + var rightTitle: String? = nil + var leftImage: URL? = nil + var rightImage: URL? = nil + + if countButton >= 1 { + let leftChoice = choices[0].name.en + if let url = URL(string: leftChoice), leftChoice.contains("https") { + leftImage = url + } else { + leftTitle = leftChoice + } + } - if countButton == 2 { - let rightChoice = choices[1].name.en - if let url = URL(string: rightChoice), rightChoice.contains("https") { - rightImage = url - } else { - rightTitle = rightChoice - } - } + if countButton == 2 { + let rightChoice = choices[1].name.en + if let url = URL(string: rightChoice), rightChoice.contains("https") { + rightImage = url + } else { + rightTitle = rightChoice + } + } - delegate?.updateTitleButton( - left: leftTitle, - right: rightTitle, - leftImage: leftImage, - rightImage: rightImage, - countButton: countButton - ) + delegate?.updateTitleButton( + left: leftTitle, + right: rightTitle, + leftImage: leftImage, + rightImage: rightImage, + countButton: countButton + ) } } From d787497c8b357d23600a1ba2c8a945ec31b624eb Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:07:34 -0800 Subject: [PATCH 25/30] fixing flanker model indentation --- ios/FlankerNativeComponents/GameManager.swift | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 15b19a7ff..a41d40126 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -157,18 +157,16 @@ class GameManager { } let buttonPressed = (button == .left) ? "0" : "1" - let model = FlankerModel( - rt: resultTime, - stimulus: text, - button_pressed: buttonPressed, - image_time: endTrialTimestamp! * 1000, - correct: isCorrect, - start_timestamp: 0, - tag: Constants.tag, - trial_index: countTest + 1, - start_time: startTrialTimestamp * 1000, - response_touch_timestamp: respondTouchButton! * 1000 - ) + let model = FlankerModel(rt: resultTime, + stimulus: text, + button_pressed: buttonPressed, + image_time: endTrialTimestamp! * 1000, + correct: isCorrect, + start_timestamp: 0, + tag: Constants.tag, + trial_index: countTest + 1, + start_time: startTrialTimestamp * 1000, + response_touch_timestamp: respondTouchButton! * 1000) resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil, isShowResults: false, minAccuracy: gameParameters.minimumAccuracy) @@ -270,8 +268,7 @@ class GameManager { tag: Constants.tag, trial_index: countTest + 1, start_time: startTrialTimestamp * 1000, - response_touch_timestamp: 0 - ) + response_touch_timestamp: 0) resultManager.addStepData(data: model) delegate?.resultTest(avrgTime: nil, procentCorrect: nil, data: model, dataArray: nil,isShowResults: gameParameters.showResults, minAccuracy: gameParameters.minimumAccuracy) From 47d733a597d45bd0bae909c4e6ff99e12500e172 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:09:14 -0800 Subject: [PATCH 26/30] fixing setText indentation --- ios/FlankerNativeComponents/GameManager.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index a41d40126..5c523e431 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -232,15 +232,15 @@ class GameManager { text = gameParameters.trials[countTest].stimulus.en if let image = URL(string: text), text.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) + delegate?.updateFixations(image: image, isStart: true, typeTime: .trial) } else { - delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) + delegate?.updateText(text: text, color: .black, font: Constants.bigFont, isStart: true, typeTime: .trial) } DispatchQueue.main.asyncAfter(deadline: .now()) { - self.delegate?.setEnableButton(isEnable: true) - self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) - RunLoop.main.add(self.timeResponse!, forMode: .common) + self.delegate?.setEnableButton(isEnable: true) + self.timeResponse = Timer(timeInterval: gameParameters.trialDuration / 1000, target: self, selector: #selector(self.timeResponseFailed), userInfo: nil, repeats: false) + RunLoop.main.add(self.timeResponse!, forMode: .common) } } From 4139794744086d526bc29d18498c4fa82d9e5dcd Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:10:16 -0800 Subject: [PATCH 27/30] fixing setDefaultText indentation --- ios/FlankerNativeComponents/GameManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 5c523e431..e8331ab5a 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -178,7 +178,7 @@ class GameManager { let timer = Timer(timeInterval: Constants.lowTimeInterval, target: self, selector: #selector(setDefaultText), userInfo: nil, repeats: false) RunLoop.main.add(timer, forMode: .common) } else { - setDefaultText(isFirst: false) + setDefaultText(isFirst: false) } } From 1786b38d1b72ea6adf8607021cf248cc7edd1e2f Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:12:08 -0800 Subject: [PATCH 28/30] fixing gameParameters.showFixation indentation --- ios/FlankerNativeComponents/GameManager.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index e8331ab5a..8fa72212f 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -204,15 +204,15 @@ class GameManager { updateButtonTitle() if gameParameters.showFixation { - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) + setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) - if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { - delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) - } else { - delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) - } - timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) - RunLoop.main.add(timerSetText!, forMode: .common) + if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { + delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) + } else { + delegate?.updateText(text: gameParameters.fixation, color: .black, font: Constants.bigFont, isStart: true, typeTime: .fixations) + } + timerSetText = Timer(timeInterval: gameParameters.fixationDuration / 1000, target: self, selector: #selector(setText), userInfo: nil, repeats: false) + RunLoop.main.add(timerSetText!, forMode: .common) } else { setText() } From 447717b07a8d9d4e739c7bcd6699a0e71ef96801 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Wed, 13 Nov 2024 16:14:25 -0800 Subject: [PATCH 29/30] fixing game manager indentation --- ios/FlankerNativeComponents/GameManager.swift | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 8fa72212f..1fbd88069 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -153,7 +153,7 @@ class GameManager { let correctChoice = gameParameters.trials[countTest].correctChoice let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) if isCorrect { - correctAnswers += 1 + correctAnswers += 1 } let buttonPressed = (button == .left) ? "0" : "1" @@ -335,29 +335,29 @@ private extension GameManager { var rightImage: URL? = nil if countButton >= 1 { - let leftChoice = choices[0].name.en - if let url = URL(string: leftChoice), leftChoice.contains("https") { - leftImage = url - } else { - leftTitle = leftChoice - } + let leftChoice = choices[0].name.en + if let url = URL(string: leftChoice), leftChoice.contains("https") { + leftImage = url + } else { + leftTitle = leftChoice + } } if countButton == 2 { - let rightChoice = choices[1].name.en - if let url = URL(string: rightChoice), rightChoice.contains("https") { - rightImage = url - } else { - rightTitle = rightChoice - } + let rightChoice = choices[1].name.en + if let url = URL(string: rightChoice), rightChoice.contains("https") { + rightImage = url + } else { + rightTitle = rightChoice + } } delegate?.updateTitleButton( - left: leftTitle, - right: rightTitle, - leftImage: leftImage, - rightImage: rightImage, - countButton: countButton + left: leftTitle, + right: rightTitle, + leftImage: leftImage, + rightImage: rightImage, + countButton: countButton ) } } From 3323d47ee08499062338dd5e2c37b7c795038528 Mon Sep 17 00:00:00 2001 From: Felipe Imperio Date: Thu, 14 Nov 2024 14:06:38 -0800 Subject: [PATCH 30/30] removing setEndTimeViewingImage calls --- ios/FlankerNativeComponents/GameManager.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ios/FlankerNativeComponents/GameManager.swift b/ios/FlankerNativeComponents/GameManager.swift index 1fbd88069..8e08f41a5 100644 --- a/ios/FlankerNativeComponents/GameManager.swift +++ b/ios/FlankerNativeComponents/GameManager.swift @@ -145,10 +145,8 @@ class GameManager { delegate?.updateTime(time: String(format: "%.3f", resultTime)) endTrialTimestamp = respondTouchButton - setEndTimeViewingImage(time: endTrialTimestamp!, isStart: false, type: .trial) startFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: startFeedbackTimestamp!, isStart: true, type: .feedback) let correctChoice = gameParameters.trials[countTest].correctChoice let isCorrect = (button == .left && correctChoice == 0) || (button == .right && correctChoice == 1) @@ -190,7 +188,6 @@ class GameManager { if !isFirst { endFeedbackTimestamp = CACurrentMediaTime() - setEndTimeViewingImage(time: endFeedbackTimestamp!, isStart: false, type: .feedback) countTest += 1 } else { countTest = 0 @@ -204,8 +201,7 @@ class GameManager { updateButtonTitle() if gameParameters.showFixation { - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: true, type: .fixations) - + startFixationsTimestamp = CACurrentMediaTime() if let image = URL(string: gameParameters.fixation), gameParameters.fixation.contains("https") { delegate?.updateFixations(image: image, isStart: true, typeTime: .fixations) } else { @@ -225,7 +221,7 @@ class GameManager { return } - setEndTimeViewingImage(time: CACurrentMediaTime(), isStart: false, type: .fixations) + endFixationsTimestamp = CACurrentMediaTime() startTrialTimestamp = CACurrentMediaTime()