using UnityEngine; using System.Collections; public class GameManager : MonoBehaviour { public int FPS = 60; public Number[] numberPrefabs; private Number[] numbers; public float[] Frequency; public int restingDuration = 0; public int epochDuration = 60*30; // sec public int totalEpoch = 100; private int REST_STATE_TOTAL_FRAMES; private int STIMULI_STATE_TOTAL_FRAMES; int frameCounter = 1; int epochCounter; [Range (-50f, 50f)] public float X_OFFSET = 0F; [Range (-50f, 50f)] public float Y_OFFSET = 0f; public enum State { INTERPUPIL_CALIBRATION, IDLE, REST, STIMULI } private State mState = State.REST; private EventWriter evWriter; /** UI refererence **/ private GameObject canvas; private const float DEFAULT_STEP_X_POS_OFFSET = 0.05f; private const float DEFAULT_STEP_Y_POS_OFFSET = 0.05f; // Use this for initialization void Start () { Logger.Print ("Application data path: " + Application.dataPath); Logger.Print ("Application persistant data path: " + Application.persistentDataPath); Application.targetFrameRate = FPS; numbers = new Number[9]; // get digit from scene (for manual position) numbers[0] = GameObject.Find("digit_1_2deg").GetComponent(); numbers[1] = GameObject.Find("digit_2_2deg").GetComponent(); numbers[2] = GameObject.Find("digit_3_2deg").GetComponent(); numbers[3] = GameObject.Find("digit_4_2deg").GetComponent(); numbers[4] = GameObject.Find("digit_5_2deg").GetComponent(); numbers[5] = GameObject.Find("digit_6_2deg").GetComponent(); numbers[6] = GameObject.Find("digit_7_2deg").GetComponent(); numbers[7] = GameObject.Find("digit_8_2deg").GetComponent(); numbers[8] = GameObject.Find("digit_9_2deg").GetComponent(); PatternArrayFileWriter patternArrayFileWriter = new PatternArrayFileWriter (Application.persistentDataPath + "/sequences.csv"); for (int i = 0; i < 9; i++) { numbers[i].Init (); numbers[i].PatternArray = PatternArrayGenerator.GetPatternArraySineWave(Frequency[i],epochDuration,FPS,false); patternArrayFileWriter.WriteSequence (Frequency[i], numbers [i].PatternArray); } patternArrayFileWriter.CloseFile (); /** Dynamically instantiate number **/ // for (int i = 0; i < 9; i++) { // numbers [i] = Instantiate (numberPrefabs [i]) as Number; // numbers [i].name = "digit" + i; // // numbers [i].Init (); // initialize renderer // numbers[i].PatternArray = PatternArrayGenerator.GetPatternArraySineWave(Frequency[i],epochDuration,FPS,false); // } // InitNumberPosition (); REST_STATE_TOTAL_FRAMES = restingDuration * FPS; STIMULI_STATE_TOTAL_FRAMES = epochDuration * FPS; // Event Writer evWriter = new EventWriter(); evWriter.InitLsl ("vep-phonedial-marker"); canvas = GameObject.Find ("Canvas"); #if UNITY_ANDROID // TranslateCanvas(-6.65f, 0f); #endif } /** void UpdateNumberPosition() { foreach (Number n in numbers) { n.setPositionOffset (X_OFFSET, Y_OFFSET); } } **/ /** void InitNumberPosition() { numbers [0].transform.localPosition = new Vector3 (-1f + X_OFFSET, 1f + Y_OFFSET); numbers [1].transform.localPosition = new Vector3 (0f + X_OFFSET, 1f + Y_OFFSET); numbers [2].transform.localPosition = new Vector3 (1f + X_OFFSET, 1f + Y_OFFSET); numbers [3].transform.localPosition = new Vector3 (-1f + X_OFFSET, 0f + Y_OFFSET); numbers [4].transform.localPosition = new Vector3 (0f + X_OFFSET, 0f + Y_OFFSET); numbers [5].transform.localPosition = new Vector3 (1f + X_OFFSET, 0f + Y_OFFSET); numbers [6].transform.localPosition = new Vector3 (-1f + X_OFFSET, -1f + Y_OFFSET); numbers [7].transform.localPosition = new Vector3 (0f + X_OFFSET, -1f + Y_OFFSET); numbers [8].transform.localPosition = new Vector3 (1f + X_OFFSET, -1f + Y_OFFSET); } **/ // Update is called once per frame void Update () { UPDATEBIGLOOP: // UpdateNumberPosition (); switch (mState) { case State.INTERPUPIL_CALIBRATION: // Parse inputs if (Input.GetKeyDown (KeyCode.Space)) ChangeState (State.REST); else if (Input.GetKeyDown (KeyCode.LeftArrow)) TranslateCanvas (-DEFAULT_STEP_X_POS_OFFSET, 0); else if (Input.GetKeyDown (KeyCode.RightArrow)) TranslateCanvas (DEFAULT_STEP_X_POS_OFFSET, 0); else if (Input.GetKeyDown (KeyCode.UpArrow)) TranslateCanvas (0, DEFAULT_STEP_Y_POS_OFFSET); else if (Input.GetKeyDown (KeyCode.DownArrow)) TranslateCanvas (0, -DEFAULT_STEP_Y_POS_OFFSET); break; case State.IDLE: break; case State.REST: if (frameCounter <= REST_STATE_TOTAL_FRAMES) { } else { ChangeState (State.STIMULI); frameCounter = 1; goto UPDATEBIGLOOP; } break; case State.STIMULI: if (this.epochCounter < totalEpoch) { if (frameCounter <= STIMULI_STATE_TOTAL_FRAMES) { RenderTargetStimuli (); } else { Logger.Print ("Epoch end!"); ResetTargetStimuliPatternSequence (); // HideTargetStimuli (); epochCounter++; // ChangeState (State.REST); // continuous evWriter.Write (Event.ONSET); frameCounter = 1; goto UPDATEBIGLOOP; // RedCenterCrosshairInstance.hide (); // ChangeState (State.IDLE); } } break; } frameCounter++; } void ChangeState(State targetState) { State prevState = mState; switch (targetState) { case State.REST: evWriter.Write (Event.REST); break; case State.STIMULI: evWriter.Write (Event.ONSET); break; } frameCounter = 0; mState = targetState; Debug.Log ("Changing state: " + prevState + " to: " + mState); } void HideTargetStimuli() { foreach (Number n in numbers) { n.hide (); n.reset (); } } void ResetTargetStimuliPatternSequence() { foreach (Number n in numbers) { n.reset (); } } void RenderTargetStimuli() { foreach (Number n in numbers) { if (n.hasRemainingPattern ()) { if (n.getNextPatternArray () <= 0) { n.hide (); } else { n.show (); } } else { // repeat the pattern Logger.Print("reset pattern"); n.reset (); if (n.getNextPatternArray () <= 0) { n.hide (); } else { n.show (); } } // Logger.Print ("Pattern array idx=" + n.getPatternArrayIndex()); } } void TranslateCanvas(float xPos, float yPos) { Vector3 canvasPos = canvas.transform.position; Vector3 newCanvasPos = new Vector3 (canvasPos.x + xPos, canvasPos.y + yPos, 0); canvas.transform.position = newCanvasPos; } }