class RemoteControl:
	# Create bus object
	bus = Bus()
	# Create a dictionary to be used to keep states from joy_core
	states = { 'A':0, 'B':0, 'X':0, 'Y':0,  		   		\
		'Back':0, 'Start':0, 'Middle':0,		   			\
		'Left':0, 'Right':0, 'Up':0, 'Down':0, 				\
		'LB':0, 'RB':0, 'LT':0, 'RT':0,						\
		'LJ/Button':0, 'RJ/Button':0, 						\
		'LJ/Left':0, 'LJ/Right':0, 'LJ/Up':0, 'LJ/Down':0, 	\
		'RJ/Left':0, 'RJ/Right':0, 'RJ/Up':0, 'RJ/Down':0,	\
		'Byte0':0, 'Byte1':0, 'Byte2':0, 'Byte3':0,			\
		'Byte4':0, 'Byte5':0, 'Byte6':0, 'Byte7':0,			\
		'Byte0/INT':0, 'Byte1/INT':0, 'Byte2/INT':0, 		\
		'Byte3/INT':0, 'Byte4/INT':0, 'Byte5/INT':0, 		\
		'Byte6/INT':0, 'Byte7/INT':0}
		
	checkController = True
	def __init__(self):
		self.robotServer = RobotServer()
		#self.robotServer.getConnection()
		self.parsercore = ParserCore(self.bus, self.states, self.checkController)

	
	def scaleMotorPower(self, left, right, limit):
		scaledLeft  = int((float(left) /127.0)*float(limit))
		scaledRight = int((float(right)/127.0)*float(limit))
		return scaledLeft, scaledRight
		
	def main(self):
   		timeout = 0.005
   		self.robotServer.getConnection()
   		print("robotConnected")
   		self.parsercore.start()
   		print("controller started")
   		self.quit = False
   		self.robotServer.sendStart()
   		print('Enter Q to quit: ')
   		while(self.quit == False):
			self.robotServer.getRobotState()
   			rlist, _, _ = select([sys.stdin], [], [], timeout)
			if rlist:
				print("input received")
				s = sys.stdin.readline()
				if(s == 'Q'):
					print("Q detected. Quiting..")
					self.quit = True
					self.checkController = False
					self.parsercore.join()
				else:
					print("Not 'Q'\nEnter Q to quit:")
					
			leftPower = self.states['LJ/Up'] + self.states['LJ/Down']
			rightPower = self.states['RJ/Up'] + self.states['RJ/Down']
			leftPower, rightPower = self.scaleMotorPower(leftPower, rightPower, 40)
			print(leftPower, rightPower)
			sent = self.robotServer.sendAction(int(leftPower), int(rightPower))
		
		self.robotServer.close()
class RobotEnvironment(Environment):
	indim = 2
	outdim = 9
	robotstarted = False

	def __init__(self, polelength=None):
		self.robotServer = RobotServer()
		self.robotServer.getConnection()
		self.sensors = [0,0,0,0,0,0,0,0,0]
		self.action = [0,0]

	def getSensors(self):
		return self.sensors	

	def updateSensors(self):
		state = self.robotServer.getRobotState()
		stateVars = state.split(",")
		stateVars = map(float, stateVars)
		self.sensors = stateVars

	def performAction(self, action):
		self.action = action
		self.step()

	def step(self):
		self.robotServer.sendAction(self.action[0], self.action[1])
		self.updateSensors()

	def reset(self):
		self.sensors = [0,0,0,0,0,0,0,0,0]
		self.action = [0,0]
	
	def start(self):
		msg = self.robotServer.readMessage()
		if(msg == "Start?"):
			self.robotServer.sendStart()
			msg = self.robotServer.readMessage()
			if(msg == "Starting"):
				return True
	def end(self):
		self.robotServer.sendEnd()