Example #1
0
	def __init__(self, vehicle, parser):
		self.parser = parser
		self.gui = DebugGui()

		self._idleRpm = self.parser.getEngineRpmIdle()
		self._maxRpm = self.parser.getEngineRpmMax()
		self._torqueFuncs = self.parser.getTorqueFuncs()
		self._curRpm = self._idleRpm
		self._curTorque = 0.

		self._gasPedal = 0.0	# Range: 0.0 - 1.0
		self._brakePedal = 0.0

		self._vehicle = vehicle
		self._gearbox = AutomaticGearbox(self.parser.getGearRatios(), self.parser.getPoweredAxleRatio())
Example #2
0
def start_debug(thermostat):
    chatbot = DebugBot(access_codes.jid, access_codes.password, thermostat)
    chatbot.register_plugin('xep_0030')  # Service Discovery
    chatbot.register_plugin('xep_0004')  # Data Forms
    chatbot.register_plugin('xep_0060')  # PubSub
    chatbot.register_plugin('xep_0199', {
        'keepalive': True,
        'interval': 60,
        'timeout': 15
    })  # XMPP Ping
    if chatbot.connect(('talk.google.com', 5222)):
        logging.info("logged in to talk.google.com")
        chatbot.process(block=False)
    else:
        logging.warning("login to talk.google.com failed")
        sys.exit(0)

    app = QApplication(sys.argv)
    debugUi = DebugGui("Temp sensor disconnected")

    sys.exit(app.exec_())
Example #3
0
class Drivetrain:
	def __init__(self, vehicle, parser):
		self.parser = parser
		self.gui = DebugGui()

		self._idleRpm = self.parser.getEngineRpmIdle()
		self._maxRpm = self.parser.getEngineRpmMax()
		self._torqueFuncs = self.parser.getTorqueFuncs()
		self._curRpm = self._idleRpm
		self._curTorque = 0.

		self._gasPedal = 0.0	# Range: 0.0 - 1.0
		self._brakePedal = 0.0

		self._vehicle = vehicle
		self._gearbox = AutomaticGearbox(self.parser.getGearRatios(), self.parser.getPoweredAxleRatio())

	# === Engine Stuff ===
	def __getTorque(self, gas):
		for func in self._torqueFuncs:
			if self._curRpm >= func["lo"] and self._curRpm < func["hi"]:
				# Take internal resistance (motor brake effect) into account
				resistance = 0.5 * self._curRpm# * (1. - gas)
				rpm = self._curRpm # Used by "function"
				return eval(func["function"]) * gas - resistance

		# This really should never happen!
		print "[wrn] Drivetrain:Engine:_getTorque(): no matching torque curve for %s rpm!" % (self._curRpm)
		return 0.

	def __calcOutputTorque(self, dt, outputRpm, inputRpm, inputTorque):
		factor = 0

		if inputRpm > 0.:
			factor = 1 - (outputRpm / inputRpm)
			#print "f", factor
			if factor < 0:
				factor = 0
			if factor > 1:
				factor = 1

		if inputRpm > outputRpm:
			if not outputRpm == 0:
				factor = inputRpm / outputRpm * -1.
			else:
				factor = 1
		else:
			if not inputRpm == 0:
				factor = outputRpm / inputRpm
			else:
				factor = 1

		return inputTorque * factor

	def __updateEngine(self, dt, inputRpm):
		if self._gearbox.getGbState() == "d" and self._curRpm > self._idleRpm:
			self._curRpm = inputRpm

		virtualGas = self._gasPedal

		# Keep ourselves alive
		if self._curRpm < (self._idleRpm):
			virtualGas = min(self._gasPedal + 0.6, 1.0)
			#self._curRpm = self._idleRpm
		elif self._curRpm >= (self._maxRpm * 0.9):
			print "Engine.update: overrevving, setting gas = 0.!"
			virtualGas = 0.

		# Apply torque as functions in vehicle.xml specify
		self._curTorque = self.__getTorque(virtualGas)

		# Do some work!
		# TODO: this is bullshit - really?
		self._curRpm += self._curTorque * dt
		self.gui.update("rpm: " + repr(int(self._curRpm))
			+ "\ntrq: " + repr(int(self._curTorque)))

	# === Drivetrain Stuff ===
	def _calcWheelRpm(self, dt):
		# Average the delta rotation value for all powered wheels
		drot = 0.
		poweredAxleCount = 0

		for axIndex in range(0, self.parser.getAxleCount()):
			if self.parser.axleIsPowered(axIndex):
				# TODO only consider wheels that have ground contact
				drot += self._vehicle.getWheel(2 * axIndex).getDeltaRotation()
				drot += self._vehicle.getWheel(2 * axIndex + 1).getDeltaRotation()
				poweredAxleCount += 1

		drot = abs(drot) / (2 * poweredAxleCount)
		wheelRpm = drot * (1./dt) # Average of the rear wheels' rotation speed (revs per second)
		wheelRpm *= 60 # convert to revs per minute

		return wheelRpm

	def update(self, dt):
		# input: wheels -> engine
		inputRpm = self._calcWheelRpm(dt) # effectively is inputRpm approx. the postGearRpm from the last frame
		preGearRpm = self._gearbox.getPreRpm(inputRpm)
		self.__updateEngine(dt, preGearRpm)

		# output: engine -> wheels
		postGearRpm = self._gearbox.getPostRpm(self._curRpm)
		postGearTorque = self._gearbox.getPostTorque(self._curTorque)
		outputTorque = self.__calcOutputTorque(dt, postGearRpm, inputRpm, postGearTorque)
		#print "wheel torque: ", outputTorque

		if self._gearbox.getGbState() == "p":
			for axIndex in range(0, self.parser.getAxleCount()):
				self._vehicle.setBrake(self.parser.getParkingBrakeForce() * self._brakePedal, 2 * axIndex)
				self._vehicle.setBrake(self.parser.getParkingBrakeForce() * self._brakePedal, 2 * axIndex + 1)
		else:
			# Use the force!
			for axIndex in range(0, self.parser.getAxleCount()):
				if self.parser.axleIsPowered(axIndex):
					self._vehicle.applyEngineForce(outputTorque, 2 * axIndex)
					self._vehicle.applyEngineForce(outputTorque, 2 * axIndex + 1)
			
			# Strong the dark side is in you
			for axIndex in range(0, self.parser.getAxleCount()):
				self._vehicle.setBrake(self.parser.getBrakingForce() * self._brakePedal, 2 * axIndex)
				self._vehicle.setBrake(self.parser.getBrakingForce() * self._brakePedal, 2 * axIndex + 1)

	def setGas(self, gas):
		if gas <= 1. and gas >= 0.:
			self._gasPedal = gas
		else:
			print "Drivetrain:setGas(gas) out of range! (0 < x < 1)"

	def setBrake(self, brake):
		if brake <= 1. and brake >= 0.:
			self._brakePedal = brake
		else:
			print "Drivetrain:setBrake(brake) out of range! (0 < x < 1)"

	def getRpm(self):
		return self._curRpm
	def getGasPedal(self):
		return self._gasPedal
	def getGbState(self):
		return self._gearbox.getGbState()
	def getGear(self):
		return self._gearbox.getGear()
	def shiftDrive(self):
		self._gearbox.shiftDrive()
	def shiftNeutral(self):
		self._gearbox.shiftNeutral()
	def shiftReverse(self):
		self._gearbox.shiftReverse()
	def shiftPark(self):
		self._gearbox.shiftPark()