private int PerformHipnotize(int currentState, object o) { TextBoxStreamWriter.DefaultLog.WriteLine("HAL9000-> PerformHypnotize state reached."); t_SPGENHypnoSpeech = new Thread(new ThreadStart(SPGENHypnoSpeech)); t_ARMSHypnoMovements = new Thread(new ThreadStart(ARMSHypnoMovements)); t_HEADHypnoMovements = new Thread(new ThreadStart(HEADHypnoMovements)); //to allow threads execution hypnoSpeechFinished = false; //introduction to hypno show cmdMan.SPG_GEN_shutup(1000); this.brain.SayAsync("I will try to hipnotize you."); Thread.Sleep(1000); this.brain.SayAsync("Look straight to my pendulum."); Thread.Sleep(1000); //move both arms to navigation moveActiveArms(SMConfiguration.ARMS_navigation, 10000); //move left arm to hypno moveOneArm(SMConfiguration.ARMS_hypnoc, 1, 10000); //Launch the thread to move asynchronous the robot's arms (hypno left and right) t_ARMSHypnoMovements.Start(); while (!t_ARMSHypnoMovements.IsAlive) { ; } //Launch the threads to move asynchronous the robot's head ("circular" movement) t_HEADHypnoMovements.Start(); while (!t_HEADHypnoMovements.IsAlive) { ; } //Launch the thread to asynchronously play the speech t_SPGENHypnoSpeech.Start(); while (!t_SPGENHypnoSpeech.IsAlive) { ; } if (t_SPGENHypnoSpeech.IsAlive) { t_SPGENHypnoSpeech.Join(); } if (t_HEADHypnoMovements.IsAlive) { t_HEADHypnoMovements.Join(); } if (t_ARMSHypnoMovements.IsAlive) { t_ARMSHypnoMovements.Join(); } //send the arms back to navigation and home moveActiveArms(SMConfiguration.ARMS_navigation, 10000); moveActiveArms(SMConfiguration.ARMS_home, 10000); //look at the human face cmdMan.HEAD_lookat(SMConfiguration.HEAD_lookToFace.pan, SMConfiguration.HEAD_lookToFace.tilt, 2000); this.brain.SayAsync("now you are under my control!!!"); Thread.Sleep(1000); this.brain.SayAsync("I command you to give me a token!"); Thread.Sleep(2000); return((int)States.InitialState); }