from components.aplant import APlant
from components.plant import delay

class Pot(APlant):
	def __init__(self, dt, params, theta_amb=20):
		APlant.__init__(self)
		self.dt = dt

		self.e = 0
		self.x = 0
		self.p_pot = 0

		# Plant specific thermal capacity [W*s/(kg*K)]
		self.C = params['C']

		# Plant mass [kg]
		self.M = params['M']

		# Plant energy loss coefficient [W/(kg*K)]
		# Negative input power as a function of plant mass and temperature difference T_plant and T_ambient
		# P_loss = L * Mass * (T_plant - T_ambient)
		self.L = params['L']

		# Energy transport propagation delay
		self.Td = params['Td']

		# Plant temperature [°C]
		self.temp = theta_amb

		# Ambient temperature [°C]
		self.theta_amb = theta_amb

		# Set power [W]
		self.p_in = 0

		# Plant delay [s]
		self.delay = delay.Delay(dt, self.Td, 0)

	def initial(self, temp):
		self.temp = temp

	def activate(self, enable):
		pass

	def process(self):
		self.delay.put(self.p_in)

		p_loss = self.L * self.M * (self.temp - self.theta_amb)
		self.p_pot = self.delay.get() - p_loss

		self.temp = min(100, self.temp + self.p_pot/(self.M * self.C) * self.dt)

	def is_activated(self):
		return True

	def set_ambient_temperature(self, theta_amb):
		self.theta_amb = theta_amb

	def set_thermal_params(self, M, C):
		self.M = M
		self.C = C

	def set_power(self, power):
		self.p_in = power

	def get_power(self):
		return round(self.p_in, 1)

	def get_temperature(self):
		return self.temp

	def get_p_pot(self):
		return self.p_pot

