Beispiel #1
0
 def update(self, uKey: KeyTracker, iKey: KeyTracker, spaceKey: KeyTracker,
            sm: StateMachine, thisExp: ExperimentHandler):
     if self.firstFrame:
         logging.exp(f"Trial first frame")
         sm.lock()
         sm.dontDrawSM()
         self.firstFrame = False
     if not self.welcomedMsg and spaceKey.getKeyUp():
         logging.exp(
             f"Trial user confirmed welcome, begin episode: {self.episodeNum}"
         )
         self.welcomedMsg = True
         self.resetSM(sm)
         sm.unlock()
         sm.doDrawSM()
         self.episodeTimer = core.Clock()
     if self.welcomedMsg and not self.endEpisode:
         if sm.movesLeft == 0:
             logging.exp(f"Trial user finished episode")
             self.TrialScores.append(sm.totalScore)
             self.TrialTimes.append(self.episodeTimer.getTime())
             self.endEpisode = True
             sm.dontDrawSM()
             sm.lock()
     if self.endEpisode and spaceKey.getKeyUp():
         self.endEpisode = False
         self.episodeNum += 1
         logging.exp(
             f"Trial user confirmed end episode, begin episode: {self.episodeNum}"
         )
         self.episodeTimer = core.Clock()
         self.resetSM(sm)
         sm.unlock()
         sm.doDrawSM()
     if not self.complete and self.episodes <= self.episodeNum:
         self.complete = True
         thisExp.addData('Trial Scores', self.TrialScores)
         thisExp.addData('Trial Times', self.TrialTimes)
         self.TrialTimes = []
         self.TrialScores = []
    def update(self, uKey: KeyTracker, iKey: KeyTracker, spaceKey: KeyTracker,
               sm: StateMachine):
        phases = self.phase
        newPhase = self.currentPhase
        if uKey.getKeyUp():
            self.buttonPresses[0] += 1
        if iKey.getKeyUp():
            self.buttonPresses[1] += 1
        # ======================================================================
        # phase change logic: handles logic for transitions between phases
        # ======================================================================
        # === 0->2 =============================================================
        if self.isPhase("start") and self.uGthan(0):
            newPhase = phases["pressI"]
        # === 0->1 =============================================================
        if self.isPhase("start") and self.iGthan(0):
            newPhase = phases["pressU"]
        # === 1,2->3 ===========================================================
        if self.isPhases(["pressI", "pressU"
                          ]) and self.uGthan(0) and self.iGthan(0):
            newPhase = phases["timed"]
            self.practiceTimer.reset()
        # === 3,4,5,6->7 =======================================================
        isRememberUIPhase = self.isPhases(
            ["rememberUI", "rememberU", "rememberI"])
        if self.isPhase("timed") and self.isTimerUp(
                "practice") or isRememberUIPhase:
            if self.uLthan(self.targetPresses) and self.iLthan(
                    self.targetPresses):
                newPhase = phases["rememberUI"]
            elif self.uLthan(self.targetPresses):
                newPhase = phases["rememberU"]
            elif self.iLthan(self.targetPresses):
                newPhase = phases["rememberI"]
            else:
                newPhase = phases["targetIntro"]
                sm.lock()
        # === 7->8 =============================================================
        if self.isPhase("targetIntro") and spaceKey.getKeyUp():
            newPhase = phases["2moves"]
            sm.unlock()
        # === 8->9 =============================================================
        if self.isPhase(
                "2moves") and sm.inCorrectState() and sm.movesLeft <= 0:
            self.movesPos += 1
            if self.movesPos >= len(self.twoMovesArr):
                newPhase = phases["1moves"]
            else:
                self.resetSM(sm)
        # === 9->10 ============================================================
        if self.isPhase(
                "1moves") and sm.inCorrectState() and sm.movesLeft <= 0:
            self.movesPos += 1
            if self.movesPos >= len(self.oneMovesArr):
                newPhase = phases["practice2"]
                sm.lock()
            else:
                self.resetSM(sm)
        # === 10->11 ===========================================================
        if self.isPhase("practice2") and spaceKey.getKeyUp():
            newPhase = phases["memoryI"]
            sm.lock()
        # === 11->12 ===========================================================
        if self.isPhase("memoryI") and spaceKey.getKeyUp():
            newPhase = phases["memory"]
            self.buttonPresses = [0, 0]
            sm.unlock()
        # === 11->12 ===========================================================
        if self.isPhase("memory") and (
                self.buttonPresses[0] +
                self.buttonPresses[1]) >= self.targetPresses2:
            newPhase = phases["grab"]
            sm.reset()
        # === 12->13 ===========================================================
        if self.isPhase("grab") and sm.totalScore >= self.pointRequirement:
            newPhase = phases["grab2movesI"]
            self.successes = 0
            sm.lock()
        # === 13->14 ===========================================================
        if self.isPhase("grab2movesI") and spaceKey.getKeyUp():
            newPhase = phases["grab2moves"]
            sm.reset()
            sm.unlock()
        # === 14->15 ===========================================================
        if self.isPhase(
                "grab2moves") and self.successes >= self.successful2moves:
            newPhase = phases["timeI"]
            self.successes = 0
            sm.lock()
            sm.dontDrawSM()
        # === 16->17 ===========================================================
        if self.isPhase("timeI") and spaceKey.getKeyUp():
            newPhase = phases["time"]
            sm.reset()
            sm.unlock()
            sm.doDrawSM()
            self.moveTimer.reset()
            self.thinkTimer.reset()
        # === 17->complete ===========================================================
        if self.isPhase("time") and self.successes >= self.successfulTime:
            newPhase = phases["complete"]
            sm.unlock()
        # ======================================================================
        # phase changing: handles when phases change
        # ======================================================================
        phaseChanged = not self.currentPhase == newPhase
        if self.devModeOn:
            if uKey.getKeyUp() or iKey.getKeyUp():
                self.devModeOn = False
                logging.exp(f"dev mode off")
                print(f"dev mode off")
            if not phaseChanged and spaceKey.getKeyUp():
                self.deveModePhase += 1
                newPhase = self.deveModePhase
                logging.exp(
                    f"Debug mode override new Practice Phase: {newPhase}")
                print(f"Debug mode override new Practice Phase: {newPhase}")
        if phaseChanged:
            logging.exp(f"New Practice Phase: {newPhase}")
        self.currentPhase = newPhase
        # ======================================================================
        # conditional update checks: handles specific phase logic
        # ======================================================================
        if self.isPhases(["2moves", "1moves"]):
            if phaseChanged:
                self.movesPos = 0
                self.resetSM(sm)
            if sm.movesLeft <= 0 and not sm.inCorrectState():
                self.resetSM(sm)
        if self.isPhase("grab2moves"):
            if sm.movesLeft == 0:
                sm.lock()
                if spaceKey.getKeyUp():
                    self.successes += 1
                    sm.reset()
        if self.isPhase("time"):
            if spaceKey.getKeyUp() and self.roundFinished:
                sm.reset()
                sm.unlock()
                self.startedRound = False
                self.roundFinished = False
                self.thinkTimer.reset()
            if not self.startedRound:
                if self.isTimerUp(
                        "think") or uKey.getKeyUp() or iKey.getKeyUp():
                    self.startedRound = True
                    self.moveTimer.reset()
            if self.startedRound and (sm.movesLeft == 0
                                      or self.isTimerUp("move")):
                sm.lock()
                if not self.roundFinished:
                    if sm.totalScore >= 0:
                        self.successes += 1
                        logging.exp(f"pp: {newPhase} succeed timed practice")
                    else:
                        logging.exp(f"pp: {newPhase} failed timed practice")
                self.roundFinished = True

        # ======================================================================
        #  complete condition: checks if complete
        # ======================================================================
        if self.isPhase("complete") and not self.complete:
            self.complete = True
            logging.exp(f"Practice complete")