示例#1
0
	def __init__(self, dev=None, enable_ems=False):
		self.dev = dev
		self.logger = Logger('RTC')

		self.can_id = None  # todo need to be further confirm
		self.task = None

		self.ui_queue = None
		self.db = None

		self.enable_ems = enable_ems
		self.ems_data = Data() if self.enable_ems else None

		self.scheduler = BackgroundScheduler(daemon=True)
		self.set_scheduler()
示例#2
0
class RTC(object):
	def __init__(self, dev=None, enable_ems=False):
		self.dev = dev
		self.logger = Logger('RTC')

		self.can_id = None  # todo need to be further confirm
		self.task = None

		self.ui_queue = None
		self.db = None

		self.enable_ems = enable_ems
		self.ems_data = Data() if self.enable_ems else None

		self.scheduler = BackgroundScheduler(daemon=True)
		self.set_scheduler()

	def api(self, cmd, parameters):
		self.logger.info('Real-Time Controller api() ' + ' ' + cmd + ' ' + json.dumps(parameters))

		if cmd == 'TURN_OFF':
			self.turn_off()
		elif cmd == 'TURN_ON':
			self.turn_on()

	def contingency_analysis_classifier(self, can_message):
		pass

	def turn_off(self):
		self.logger.info('TURNING OFF module')

	def turn_on(self):
		self.logger.info('TURNING ON module')
		if self.task is None:
			self.task = TurnOn(self, timeout=15)
		else:
			return False

	def hi(self):
		print(ctime(time()), end='\r', flush=True)
		if self.task is not None:
			self.task.state.spent_t += 0.5
			self.task.spent_t += 0.5
			self.task.run()

			if self.task.spent_t > self.task.TIMEOUT:
				self.logger.error('Task ' + self.task.name + ' fail...')
				self.task = None

	def get_ems_data(self):

		results_dispatch = self.db.query(DispatchDBData).limit(2)
		results_unit = self.db.query(UnitsDBData).limit(2)
		results_forecast = self.db.query(ForecastDBData).limit(2)

		# todo process every line of result and send to GUI

		for d in results_dispatch:
			res = d.__dict__
			res.pop('_sa_instance_state')
			res['datetime1'] = mktime(d.datetime1.timetuple()) + d.datetime1.microsecond / 1000000.0

			self.ems_data.update(res)
			self.ui_queue.put(self.ems_data)

	def set_scheduler(self):
		self.scheduler.add_job(self.hi, 'interval', seconds=0.5)
		if self.enable_ems:
			if self.db is None:
				self.db = db_session()
			self.scheduler.add_job(self.get_ems_data, 'interval', seconds=1)

		self.scheduler.start()

	def is_bic_online(self):
		for dev in self.dev['bic']:
			if not dev.is_connected():
				self.logger.error((dev.name, ' is not online'))
				return False
		return True

	def minimum_system_online(self):

		for dev in self.dev['battery']:
			if not dev.is_connected():
				self.logger.error((dev.name, ' is not online'))
				return False

		for dev in self.dev['rm']:
			if not dev.is_connected():
				self.logger.error((dev.name, ' is not online'))
				return False

		return True