class DietFitnessFSM:
	
	def __init__(self, genUtil, robotName = "NAO", userName = "******", userNumber = 1,
				 activityInteractionType = "Daily Companion Morning", lastInteraction = False):
		self.robotName = robotName
		self.usersName = userName
		self.userNumber = userNumber
		initialState = 1 #+ 35#14
		self.state = initialState
		self.s = initialState
		self.dayCALS = 0
		self.weekActiveMin = 0
		
		self.drives = RobotDrive.RobotDriveCollection(userName, userNumber)
		self.reMM = EmotionMM()
		self.oeHMM = ObservableExpression()
		self.appraiseState = True

		self.testState = initialState

		self.stateTimeStamp = []
		self.stateDateTime = []
		self.reHist = []
		self.oeHist = []
		self.driveStatHist = []
		self.fsmStateHist = []
		self.fsmStateNameHist = []

		self.genUtil = genUtil #GenUtil(naoMotions)
		# self.naoMotions = naoMotions

		self.activityType = activityInteractionType
		# state methods are in index order of State Number
		# "activityFSMState_Terminate" is required as state 0
		# pic your interaction
		# Obsolete 3/24/2016
		self.stateMethodNames = {"Consultant By Appointment":[
								 "activityFSMState_Intro", "activityFSMState_GetName",
								 "activityFSMState_DietBreakfast", "activityFSMState_DietLunch",
								 "activityFSMState_DietDinner", "activityFSMState_DietSnack",
								 "activityFSMState_DietEnd",
								 "activityFSMState_FitMonday", "activityFSMState_FitTuesday",
								 "activityFSMState_FitWednesday", "activityFSMState_FitThursday",
								 "activityFSMState_FitFriday", "activityFSMState_FitSaturday",
								 "activityFSMState_FitSunday",
								 "activityFSMState_FitEnd", "activityFSMState_End"]}
		self.stateMethodNames["Daily Companion Morning"] = [
								"dailyFSMState_MorningIntro",
								"dailyFSMState_DietSuggest", "dailyFSMState_DietSuggestGood",
								"dailyFSMState_DietSuggestBad",
								"dailyFSMState_FitSuggest", "dailyFSMState_FitSuggestGood",
								 "dailyFSMState_FitSuggestBad",
								"dailyFSMState_MorningEnd"]
		self.stateMethodNames["Daily Companion End of Day"] = [
								"dailyFSMState_DayEndIntro",
								"dailyFSMState_DayEndDeitCheckin", "dailyFSMState_DayEndDeitCheckinYesAte",
								"dailyFSMState_DayEndDeitCheckinNoAte", "dailyFSMState_DayEndDeitCheckinNoAteYesComp",
								"dailyFSMState_DayEndDeitCheckinNoAteNoComp",
								"dailyFSMState_DayEndFitCheckin", "dailyFSMState_DayEndFitCheckinYesDid",
								"dailyFSMState_DayEndFitCheckinNoDid", "dailyFSMState_DayEndFitCheckinNoDidYesComp",
								"dailyFSMState_DayEndFitCheckinNoDidNoComp",
								"dailyFSMState_DayEndEnd"]

		activityTypes = ["Daily Companion Morning", "Daily Companion End of Day"]
		activityIndex = 0
		for i in range(len(activityTypes)):

			if activityInteractionType == activityTypes[i]:
				activityIndex = i
				break

		beginDayStates = FSMBeginDayStates(genUtil, self, userName, userNumber, robotName)
		endDayStates = FSMEndDayStates(genUtil, self, userName, userNumber, robotName, lastInteraction)
		fsmStates = [beginDayStates, endDayStates]
		self.FSMInUse = fsmStates[activityIndex]
		for i in range(len(fsmStates)):
			if activityInteractionType == fsmStates[i].getActivityType():
				self.FSMInUse = fsmStates[i]
		self.FSMStateNames = self.FSMInUse.getMethodNames()

		self.ReactiveStateNames = ["reactionScaredTouch", "reactionScaredPickedUp", "reactionScaredHighEdge"]
		self.TerminateStateNames = ["activityFSMState_Terminate"]
		#TerminateState : 0
		#FSMStateNames: 1- ~50
		#ReactiveStates are after FSMStates
		self.FSMStateNames = self.TerminateStateNames + self.FSMStateNames + self.ReactiveStateNames

		print self.FSMStateNames

		
	def activityFSM(self):
		# stateMachineInUse = self.stateMethodNames[self.activityType]
		#state: Normal interaction state (keep track of the normal state)
		#s: Normal interaction states or reactive states
		self.s = self.state
		###### for testing all states
#		s = self.testState
#		self.testState += 1
		######

		if not self.genUtil.checkSafety():
			if self.genUtil.naoIsTouched:
				self.s = self.FSMInUse.getNumMethods() + 1 # index past methods -> reactive method
			elif self.genUtil.naoIsPickedUp:
				self.s = self.FSMInUse.getNumMethods() + 2 # index past methods -> reactive method
			elif self.genUtil.naoIsHighEdge:
				self.s = self.FSMInUse.getNumMethods() + 3 # index past methods -> reactive method
			print "Reaction ", self.s
			self.genUtil.naoMotions.naoAliveOff()
		else:
			self.genUtil.wasJustScared = False

		ts = self.genUtil.getTimeStamp()
		self.stateTimeStamp.append(ts)
		self.stateDateTime.append(self.genUtil.getDateTimeFromTime(ts))
		self.fsmStateHist.append(self.s)
		self.reHist.append(self.getRENumber())
		self.oeHist.append(self.oeHMM.getObservableExpressionNumber())
		self.driveStatHist.append(self.drives.getDriveStatuses().tolist())

		# check state is legit
		if self.s < len(self.FSMStateNames):
			stateMethod_name = self.FSMStateNames[self.s]
		else:
			stateMethod_name = "There is no state of that #"
		self.fsmStateNameHist.append(stateMethod_name)
		print "State: " + str(self.s) + " " + stateMethod_name

		try:
			# get the method for the current state and run it if it exisits

			if 0 < self.s <= self.FSMInUse.getNumMethods():
				stateMethod = getattr(self.FSMInUse, stateMethod_name)
			else:
				stateMethod = getattr(self, stateMethod_name)
			
			# the method exists, how we can run it - runs the state method here
			print "State ",
			self.drives.setCurrentFSMState(self.s)
			self.appraiseState = stateMethod()

			# functions for after the state has run
			if self.appraiseState and self.genUtil.checkSafety() and self.s <= self.FSMInUse.getNumMethods() :
				# determine the emotions of the robot after this event
				np.set_printoptions(precision=4)
				driveStatuses = self.drives.getDriveStatuses() #not used
				U_in = self.drives.appraiseEmotions() #Ue
				self.showData("Overall U input: " +  str(U_in))
				U_feedback = self.oeHMM.getEmotionAssociation() #Uo
				self.showData("U Feedback: " +  str(U_feedback))
				newA = self.reMM.applyInputInfluence(U_in, U_feedback) #newA is At
				self.showData("\n" + str(newA))
				vre = self.reMM.incrementRobotEmotion()
				self.showData( "New RE: " +  str(vre))
				voe = self.oeHMM.determineObservableExpression(vre)
				self.showData( "New OE: " +  str(voe))
			elif not self.genUtil.checkSafety():
				# reactive emotion taking place
				if self.genUtil.naoIsTouched:
					self.reMM.setCurrentEmotionByNumber(6) # robot is now scared
				elif self.genUtil.naoIsPickedUp:
					self.reMM.setCurrentEmotionByNumber(5)
				elif self.genUtil.naoIsHighEdge:
					self.reMM.setCurrentEmotionByNumber(7)
				vre = self.reMM.getRobotEmotionVector()
				self.showData( "New RE: " +  str(vre))
				voe = self.oeHMM.determineObservableExpression(vre)
				self.showData( "New OE: " +  str(voe))
			self.showData("")

			#override the emotion state
			#manually set the emotion
			setEmotion = False
			if setEmotion:
				self.genUtil.showSadEyes()
				self.reMM.setCurrentEmotionByNumber(4)
				voe = self.oeHMM.determineObservableExpression(self.reMM.getRobotEmotionVector())

			if self.genUtil.checkSafety() and self.s > self.FSMInUse.getNumMethods():
				sitTest = False

				if not sitTest:
					self.genUtil.naoMotions.naoStand(0.5)

		except AttributeError as e:
			# print e
			print "An unknown FSM State Occured: ", self.getFSMState()
			print "What happened?: " + e.message
			self.s = self.FSMInUse.getNumMethods() + 1 # index past methods -> reactive method
			self.setFSMState(self.s)
		# except Exception as e:
		# 	print "What happened?: " + e.message
		# 	self.setFSMState(0)
		
		print "--------> New FSM State: ", self.getFSMState()
		return self.getFSMState() + [self.appraiseState]
		

	def activityFSMState_Terminate(self):
		print("Terminating State 0")
		appraiseState = False
		return appraiseState

	# ===================================================================
	# ======================= Diet and Fitness Consultant State Methods
	# ===================================================================
	def activityFSMState_Intro(self):
		# introduction
		self.setFSMState(self.state + 1)
		appraiseState = False
		return appraiseState
	
	def activityFSMState_GetName(self):
		self.sayWithEmotion("What is your name?")
		userName = raw_input('Enter your name: ')
		self.sendUserEmotion()
		if userName != "":
			urLikeli = self.drives.askedUser(True)
			self.usersName = userName
			self.setFSMState(self.state + 1)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		# self.genUtil.naoEmotionalSay("Dave, stop it. Stop, will you? Stop, Dave. Will you stop, Dave? Stop,"
		# 							 "Dave. I'm afraid. I'm afraid, Dave. Dave, my mind is going.", -1, 0)

		appraiseState = True
		return appraiseState

	def activityFSMState_DietBreakfast(self):
		# Callories eaten at a typical breakfast
		sayText = "About how many calories do you eat for breakfast?"
		writeText = sayText
		appraiseState = self.getDietFood(sayText, writeText)
		return appraiseState

	def activityFSMState_DietLunch(self):
		# Callories eaten at a typical breakfast
		sayText = "About how many calories do you eat for lunch?"
		writeText = sayText
		appraiseState = self.getDietFood(sayText, writeText)
		return appraiseState

	def activityFSMState_DietDinner(self):
		sayText = "About how many calories do you eat for dinner?"
		writeText = sayText
		appraiseState = self.getDietFood(sayText, writeText)
		return appraiseState

	def activityFSMState_DietSnack(self):
		# Callories eaten at a typical outside of regular meals
		sayText = "About how many calories do you eat outside of regular meals? like snacks?"
		writeText = sayText
		regularMeal = False
		appraiseState = self.getDietFood(sayText, writeText, regularMeal)
		return appraiseState

	def getDietFood(self, sayText, writeText, regularMeal=True):
		self.sayWithEmotion(sayText)
		foodCAL = raw_input(writeText + ": ")
		foodCAL = self.genUtil.toNum(foodCAL)
		self.sendUserEmotion()
		if foodCAL >= 0 and not type(foodCAL) is str:
			# if they entered a valid calorie count
			urLikeli = self.drives.askedUser(True)
			dietLikeli = self.drives.mealCalorieInput(foodCAL, regularMeal)
			
			self.dayCALS += foodCAL
			self.setFSMState(self.state+1)
		else:
			# input was bad so try again
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def activityFSMState_DietEnd(self):
		# End of the diet component of the FSM - determine if drive is satisfied
		healthyCALMax = 3000
		healthyCALMin = 2000
		if healthyCALMin <= self.dayCALS <= healthyCALMax:
			# user has a healthy diet
			self.drives.setDriveStatusDiet(2) # 2 = succeeded
			print "Drive Healthy Diet Succeeded!!"
		else:
			self.drives.setDriveStatusDiet(3) # 3 = failed
			print "Drive Healthy Diet Failed.. Person Ate: ",  self.dayCALS

		self.setFSMState(self.state+1)

		appraiseState = False
		return appraiseState
	
	def activityFSMState_FitMonday(self):
		sayText = "About how many active minutes do you get on Mondays?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def activityFSMState_FitTuesday(self):
		sayText = "About how many active minutes do you get on Tuesday?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def activityFSMState_FitWednesday(self):
		sayText = "About how many active minutes do you get on Wednesday?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def activityFSMState_FitThursday(self):
		sayText = "About how many active minutes do you get on Thursday?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def activityFSMState_FitFriday(self):
		sayText = "About how many active minutes do you get on Friday?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def activityFSMState_FitSaturday(self):
		sayText = "About how many active minutes do you get on Saturday?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def activityFSMState_FitSunday(self):
		sayText = "About how many active minutes do you get on Sunday?"
		writeText = sayText
		appraiseState = self.getFitMinutes(sayText, writeText)
		return appraiseState

	def getFitMinutes(self, sayText, writeText):
		# Amount of Activity Typically done on a monday
		self.sayWithEmotion(sayText)
		monAactiveMin = raw_input(writeText + ": ")
		monAactiveMin = self.genUtil.toNum(monAactiveMin)
		self.sendUserEmotion()
		if monAactiveMin >= 0 and not type(monAactiveMin) is str:
			# if they entered a valid calorie count
			urLikeli = self.drives.askedUser(True)
			fitLikeli = self.drives.dayActiveMinutesInput(monAactiveMin)

			self.weekActiveMin += monAactiveMin
			self.setFSMState(self.state+1)
		else:
			# input was bad so try again
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def activityFSMState_FitEnd(self):
		# End of the fitness component of the FSM - determine if drive is satisfied
		healthyActiveMax = 2000
		healthyActiveMin = 75
		if healthyActiveMin <= self.weekActiveMin <= healthyActiveMax:
			# user has a healthy diet
			self.drives.setDriveStatusFitness(2) # 2 = succeeded
			print "Drive Healthy Fitness Succeeded!!"
		else:
			self.drives.setDriveStatusFitness(3) # 3 = failed
			print "Drive Healthy Fitness Failed.."

		self.setFSMState(self.state+1)

		appraiseState = False
		return appraiseState

	def activityFSMState_End(self):
		sayText = "Thanks for interacting with me."
		self.sayWithEmotion(sayText)
		sayText = "Good bye, maybe I will see you again."
		self.genUtil.naoEmotionalVoiceSay(sayText, self.getRENumber())

		self.setFSMState(0)

		appraiseState = False
		return appraiseState

	# ========================================================================
	# ======================= Diet and Fitness Daily Companion State Methods
	# ========================================================================

	def dailyFSMState_MorningIntro(self):
		sayText = "Hello, my name is " + self.robotName + " and I am going to be your diet and fitness companion"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+1)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DietSuggest(self):
		sayText = "For Today's lunch, you should try to eat a  "
		sayText += "Turkey sandwich, on whole wheat bread, with lettuce, tomatoes, mayonnaise, and a slice of swiss cheese."
		self.sayWithEmotion(sayText)

		sayText = "How does that sound?"
		self.genUtil.naoEmotionalVoiceSay(sayText, self.getRENumber())
		writeText = "How did that sound?"
		textInput = raw_input(writeText + ": ")
		self.sendUserEmotion()
		if textInput != "":
			urLikeli = self.drives.askedUser(True)
			if textInput.lower() == "good":
				self.setFSMState(self.state+1)
			else:
				self.setFSMState(self.state+2)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def dailyFSMState_DietSuggestGood(self):
		sayText = "Great!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+2)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DietSuggestBad(self):
		sayText = "Well, do it anyways!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+1)
		appraiseState = False
		return appraiseState

	def dailyFSMState_FitSuggest(self):
		sayText = "For Today's exercise, you should try to "
		sayText += "Go for a brisk walk 5 times around your workplace building, and take the stairs whenever possible"
		self.sayWithEmotion(sayText)

		sayText = "How does that sound?"
		self.genUtil.naoEmotionalVoiceSay(sayText, self.getRENumber())
		writeText = "How did that sound?"
		textInput = raw_input(writeText + ": ")
		self.sendUserEmotion()
		if textInput != "":
			urLikeli = self.drives.askedUser(True)
			if textInput.lower() == "good":
				self.setFSMState(self.state+1)
			else:
				self.setFSMState(self.state+2)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def dailyFSMState_FitSuggestGood(self):
		sayText = "Great!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+2)
		appraiseState = False
		return appraiseState

	def dailyFSMState_FitSuggestBad(self):
		sayText = "Well, do it anyways!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+1)
		appraiseState = False
		return appraiseState

	def dailyFSMState_MorningEnd(self):
		sayText = "Now go do those things, I will check up on you later in the day."
		self.sayWithEmotion(sayText)

		self.setFSMState(0)

		appraiseState = False
		return appraiseState

	# ===========================================
	# ======================= End of Day States
	# ===========================================
	def dailyFSMState_DayEndIntro(self):
		sayText = "Hello, " + "person"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+1)

		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndDeitCheckin(self):
		sayText = "Did you have the " + "sandwich" + " I had suggested for " + "lunch" + " today?"
		self.sayWithEmotion(sayText)

		writeText = "Did they have the sandwich?"
		textInput = self.getUserInput(writeText)
		if textInput != "":
			urLikeli = self.drives.askedUser(True)
			if textInput.lower() == "yes":
				self.setFSMState(self.state+1)
			else:
				self.setFSMState(self.state+2)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def dailyFSMState_DayEndDeitCheckinYesAte(self):
		sayText = "That's great! You are well on your way to a healthy diet!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+4)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndDeitCheckinNoAte(self):
		sayText = "Well, did you at least have something comparably healthy instead?"
		self.sayWithEmotion(sayText)

		writeText = "Did they have something comparable?"
		textInput = self.getUserInput(writeText)
		if textInput != "":
			urLikeli = self.drives.askedUser(True)
			if textInput.lower() == "yes":
				self.setFSMState(self.state+1)
			else:
				self.setFSMState(self.state+2)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def dailyFSMState_DayEndDeitCheckinNoAteYesComp(self):
		sayText = "That's great! You are well on your way to a healthy diet!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+2)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndDeitCheckinNoAteNoComp(self):
		sayText = "You should try to have the " + "sandwich" + " tomorrow, it will put you on the right"
		sayText += "track to a healthier lifestyle!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+1)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndFitCheckin(self):
		sayText = "Did you do the exercise I suggested for you today?"
		self.sayWithEmotion(sayText)

		writeText = "Did they do the exercise?"
		textInput = self.getUserInput(writeText)
		if textInput != "":
			urLikeli = self.drives.askedUser(True)
			if textInput.lower() == "yes":
				self.setFSMState(self.state+1)
			else:
				self.setFSMState(self.state+2)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def dailyFSMState_DayEndFitCheckinYesDid(self):
		sayText = "That's great! Maybe tomorrow you can do " + "6" + " laps of your workplace" + "!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+4)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndFitCheckinNoDid(self):
		sayText = "Well, did you do any comparable or better exercises instead?"
		self.sayWithEmotion(sayText)

		writeText = "Did they do something comparable?"
		textInput = self.getUserInput(writeText)
		if textInput != "":
			urLikeli = self.drives.askedUser(True)
			if textInput.lower() == "yes":
				self.setFSMState(self.state+1)
			else:
				self.setFSMState(self.state+2)
		else:
			urLikeli = self.drives.askedUser(False)
			self.setFSMState(self.state)

		appraiseState = True
		return appraiseState

	def dailyFSMState_DayEndFitCheckinNoDidYesComp(self):
		sayText = "That's great! Keep it up!"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+2)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndFitCheckinNoDidNoComp(self):
		sayText = sayText = "Maybe tomorrow you can try only " + "2" + " laps of your workplace instead"
		self.sayWithEmotion(sayText)

		self.setFSMState(self.state+1)
		appraiseState = False
		return appraiseState

	def dailyFSMState_DayEndEnd(self):
		sayText = "Thanks for interacting with me."
		self.sayWithEmotion(sayText)
		sayText = "Good bye, maybe I will see you again."
		self.genUtil.naoEmotionalVoiceSay(sayText, self.getRENumber())

		self.setFSMState(0)

		appraiseState = False
		return appraiseState

	# ======================= Reactive State

	def becomeScared(self):
		# reactive emotion taking place
		if self.genUtil.naoIsTouched:
			self.reMM.setCurrentEmotionByNumber(6) # robot is now scared #manually set the emotion state
		elif self.genUtil.naoIsPickedUp:
			self.reMM.setCurrentEmotionByNumber(5)
		elif self.genUtil.naoIsHighEdge:
			self.reMM.setCurrentEmotionByNumber(7)

		vre = self.reMM.getRobotEmotionVector()
		print "New RE: ", vre
		voe = self.oeHMM.determineObservableExpression(vre)
		print "New OE: ", voe

	def reactionScaredTouch(self):
		sayText = "Ow Ow Ow"
		self.becomeScared()
		self.sayWithEmotion(sayText)
		time.sleep(1)

		appraiseState = True
		return appraiseState

	def reactionScaredPickedUp(self):
		sayText = "Put me down Put me down Put me down"
		self.becomeScared()
		self.sayWithEmotion(sayText)
		time.sleep(1)

		appraiseState = True
		return appraiseState

	def reactionScaredHighEdge(self):
		sayText = "I'm so high up, move me away from the edge"
		self.becomeScared()
		self.sayWithEmotion(sayText)
		time.sleep(1)

		appraiseState = True
		return appraiseState

	# ======================= Setters and Getters
	def getFSMState(self):
		fsmInfo = [self.state, self.reMM.getRobotEmotionNumber(), self.oeHMM.getObservableExpressionNumber()]
		return fsmInfo

	def getRENumber(self):
		#MM means Morkov Model
		return self.reMM.getRobotEmotionNumber()

	def getOENumber(self):
		return self.oeHMM.getObservableExpressionNumber()

	def setFSMState(self, newState):
		self.state = newState

	def getHistories(self):
		return [self.stateTimeStamp, self.stateDateTime, self.fsmStateHist,
				self.reHist, self.oeHist, self.driveStatHist, self.fsmStateNameHist]

	def getUserInput(self, writeText):
		try:
			import msvcrt
			sys.stdout.flush()
			while msvcrt.kbhit():
				msvcrt.getch()

		except Exception as e:
			print "Couldn't flush the input"
			print e

		print "***************************************************************************"
		print writeText + ": ",
		textInput = ""
		if self.genUtil.checkSafety():
			self.genUtil.waitingForInput = True
			textInput = raw_input()
			self.genUtil.waitingForInput = False

		return textInput

	# ======================= Other functions
	def getUserEmotion(self):
		# userEmotionFileName = "ProgramDataFiles\userEmotionTextDump.txt"
		# userEmotionFileName = "..\\Data_Files\\out_emotionmodelJSON_test.txt"
		userEmotionFileName = "..\\Data_Files\\out_emotionmodelJSON.txt"

		ueFileLines = FileUtilitiy.readTextLines(userEmotionFileName)
		# print "********************************************"
		# print ueFileLines
		ueJsonLines = ueFileLines[-3:]
		ueValence = 0
		ueArousal = 0
		for row in ueJsonLines:
			ueJson = json.loads(row)
			ueValence += ueJson["valence"] / 3.0
			ueArousal += ueJson["arousal"] / 3.0

		print "Valence: ", ueValence, ", Arousal: ", ueArousal
		return [ueValence, ueArousal]

	def sendUserEmotion(self):
		print "Sending user emotion"
		[ueValence, ueArousal] = self.getUserEmotion()

		return self.drives.currentUserEmotionInput(ueValence, ueArousal)

	def sendUserEmotionOnRecomend(self, recommendItem = 1):
		print "Sending user emotion on Response"
		[ueValence, ueArousal] = self.getUserEmotion()
		if recommendItem <= 3:
			return self.drives.userEmotionAfterRecomendationMeal(ueValence, ueArousal, recommendItem)
		else:
			return self.drives.userEmotionAfterRecomendationExercise(ueValence, ueArousal)

	def sayWithEmotion(self, sayText):
		self.genUtil.naoEmotionalSay(sayText, self.getOENumber())

	def waveSayWithEmotion(self, sayText):
		self.genUtil.naoMotions.naoWaveRightFirst()
		self.genUtil.naoMotions.naoWaveRightSecond(1, 2)
		self.genUtil.naoEmotionalSay(sayText, self.getOENumber())
		time.sleep(1)

	def showData(self, showText):
		fileName = "ProgramDataFiles\\" + str(self.userNumber) + "_" + self.usersName + "\\" + str(self.userNumber)  + "_" + self.usersName +"_Appraisals.txt"
		if showText != "":
			print showText
		writeText =  "currentFSMState: " + str(self.s) + " "
		writeText += showText
		FileUtilitiy.writeTextLine(fileName, writeText)
	def __init__(self, genUtil, robotName = "NAO", userName = "******", userNumber = 1,
				 activityInteractionType = "Daily Companion Morning", lastInteraction = False):
		self.robotName = robotName
		self.usersName = userName
		self.userNumber = userNumber
		initialState = 1 #+ 35#14
		self.state = initialState
		self.s = initialState
		self.dayCALS = 0
		self.weekActiveMin = 0
		
		self.drives = RobotDrive.RobotDriveCollection(userName, userNumber)
		self.reMM = EmotionMM()
		self.oeHMM = ObservableExpression()
		self.appraiseState = True

		self.testState = initialState

		self.stateTimeStamp = []
		self.stateDateTime = []
		self.reHist = []
		self.oeHist = []
		self.driveStatHist = []
		self.fsmStateHist = []
		self.fsmStateNameHist = []

		self.genUtil = genUtil #GenUtil(naoMotions)
		# self.naoMotions = naoMotions

		self.activityType = activityInteractionType
		# state methods are in index order of State Number
		# "activityFSMState_Terminate" is required as state 0
		# pic your interaction
		# Obsolete 3/24/2016
		self.stateMethodNames = {"Consultant By Appointment":[
								 "activityFSMState_Intro", "activityFSMState_GetName",
								 "activityFSMState_DietBreakfast", "activityFSMState_DietLunch",
								 "activityFSMState_DietDinner", "activityFSMState_DietSnack",
								 "activityFSMState_DietEnd",
								 "activityFSMState_FitMonday", "activityFSMState_FitTuesday",
								 "activityFSMState_FitWednesday", "activityFSMState_FitThursday",
								 "activityFSMState_FitFriday", "activityFSMState_FitSaturday",
								 "activityFSMState_FitSunday",
								 "activityFSMState_FitEnd", "activityFSMState_End"]}
		self.stateMethodNames["Daily Companion Morning"] = [
								"dailyFSMState_MorningIntro",
								"dailyFSMState_DietSuggest", "dailyFSMState_DietSuggestGood",
								"dailyFSMState_DietSuggestBad",
								"dailyFSMState_FitSuggest", "dailyFSMState_FitSuggestGood",
								 "dailyFSMState_FitSuggestBad",
								"dailyFSMState_MorningEnd"]
		self.stateMethodNames["Daily Companion End of Day"] = [
								"dailyFSMState_DayEndIntro",
								"dailyFSMState_DayEndDeitCheckin", "dailyFSMState_DayEndDeitCheckinYesAte",
								"dailyFSMState_DayEndDeitCheckinNoAte", "dailyFSMState_DayEndDeitCheckinNoAteYesComp",
								"dailyFSMState_DayEndDeitCheckinNoAteNoComp",
								"dailyFSMState_DayEndFitCheckin", "dailyFSMState_DayEndFitCheckinYesDid",
								"dailyFSMState_DayEndFitCheckinNoDid", "dailyFSMState_DayEndFitCheckinNoDidYesComp",
								"dailyFSMState_DayEndFitCheckinNoDidNoComp",
								"dailyFSMState_DayEndEnd"]

		activityTypes = ["Daily Companion Morning", "Daily Companion End of Day"]
		activityIndex = 0
		for i in range(len(activityTypes)):

			if activityInteractionType == activityTypes[i]:
				activityIndex = i
				break

		beginDayStates = FSMBeginDayStates(genUtil, self, userName, userNumber, robotName)
		endDayStates = FSMEndDayStates(genUtil, self, userName, userNumber, robotName, lastInteraction)
		fsmStates = [beginDayStates, endDayStates]
		self.FSMInUse = fsmStates[activityIndex]
		for i in range(len(fsmStates)):
			if activityInteractionType == fsmStates[i].getActivityType():
				self.FSMInUse = fsmStates[i]
		self.FSMStateNames = self.FSMInUse.getMethodNames()

		self.ReactiveStateNames = ["reactionScaredTouch", "reactionScaredPickedUp", "reactionScaredHighEdge"]
		self.TerminateStateNames = ["activityFSMState_Terminate"]
		#TerminateState : 0
		#FSMStateNames: 1- ~50
		#ReactiveStates are after FSMStates
		self.FSMStateNames = self.TerminateStateNames + self.FSMStateNames + self.ReactiveStateNames

		print self.FSMStateNames
Exemple #3
0
#recieve input
#user_valance = raw_input('Enter a user valance [-1, 1]: ')
#user_arousal = raw_input('Enter a user arousal [-1, 1]: ')
UE = np.array([0.5, 0.5])

# create the input manipulator of A
impact_ev = np.array([3, 2, 2, 1, 1, 1])
U_in = 1.0*impact_ev/np.sum(impact_ev)
print(U_in)
print


vRE = np.array([0, 1, 0, 0, 0, 0])

reMM = EmotionMM()
oeHMM = ObservableExpression()

newA = reMM.applyInputInfluence(U_in)
print newA
print

totalRE = np.zeros(nEmotions)
totalOE = np.zeros(nExpressions)
# test the distribution
for i in range(100):
	vre = reMM.incrementRobotEmotion()
	RE = reMM.getRobotEmotionNumber()
	totalRE[RE] += 1
	
	voe = oeHMM.determineObservableExpression(vre)
	OE = oeHMM.getObservableExpressionNumber()