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()
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