def _write_cr_value(self, value, wait_time=None, numretries=None): """Only to be used by set_cr_value method Value should only be an integer """ if not self.is_running(): raise ENotRunning() if numretries is None: numretries = self.retry_count data = self.cr_request_obj.findChildByName('data') bcc = self.cr_request_obj.findChildByName('bcc') checksum = (self.cr_checksum + value) & 0xFF data.setValue(value) bcc.setValue(checksum) while numretries: try: self._send_request(self.cr_request_obj, self.cr_response_obj, wait_time, 1) resp_addr = self.cr_response_obj.findChildByName('addr') resp_bcc = self.cr_response_obj.findChildByName('bcc') addr = resp_addr.getValue() bcc = resp_bcc.getValue() checksum = (0xD3 + calc_sum(addr)) & 0xFF if checksum != bcc: raise EBadChecksum() if self.bin_addr != addr: raise EInvalidMessage() return except: numretries -= 1 raise
def update_trend(self, trend_name, new_cfg, **kw): if not self.__running: raise ENotRunning() confirmed = kw.get('confirmed', 0) deletedata = kw.get('deletedata', 0) trend = self.get_trend(trend_name) confirmation = ConfirmUpdateTrend(trend, new_cfg) #@fixme, dleimbro if 0: #not confirmed and confirmation.requires_confirmation(): return confirmation if confirmation.configuration_changed(): try: if deletedata: trend.delete_existing_data() if confirmation.requires_stop_and_restart(): trend.stop() trend.configure(confirmation.configuration()) if confirmation.requires_stop_and_restart(): trend.start() except: msglog.exception() try: trend.stop() except: msglog.exception() trend.configure(confirmation.original_configuration()) trend.start() raise else: self._persist_trend_configuration(trend) return None
def stop(self): if self._running == 0: raise ENotRunning('MemoryNode') self._running = 0 CompositeNode.stop(self) for record in self.children_nodes(): record.prune() return
def stop(self): if not self.is_running(): raise ENotRunning() self.lh.disconnect() #have to see some more here ?? super(OmniProto, self).stop() msglog.log('omnimeter', msglog.types.INFO, "OMNIMETER Protocol stopping")
def get_trend(self, trend_name): if not self.__running: raise ENotRunning() if not self.trends.has_child(trend_name): # Autodiscoveresque. self.get_trends() # @fixme Raise a better exception... return self.trends.get_child(trend_name)
def release(self, level): if not self.is_running(): raise ENotRunning() try: self.priority_array.get_child(str(level)).set(None) except: msg = 'Unable to release property %s at level %d' % \ (self.as_node_url(), level) msglog.log('Entity Manager', msglog.types.WARN, msg) msglog.exception()
def rank_match(self, context): if not self.is_running(): raise ENotRunning('Not started. This may mean start failed.') if not isinstance(context, str): context = ISecurityContext(context).url if self.uses_expression: rank = self.rank_expression(context) else: rank = self.rank_overlap(context) return rank
def delete_trend(self, trend_name): if not self.__running: raise ENotRunning() self._delete_trend_configuration(trend_name) if not self.trends.has_child(trend_name): # Autodiscoveresque. self.get_trends() # @fixme Raise a better exception... trend = self.trends.get_child(trend_name) trend.prune() trend.destroy() return
def get_value(self, skipcache=0): """get method. returns the current meter reading """ if not self.is_running(): raise ENotRunning() self.lock.acquire() try: if self.is_value_stale() or skipcache: self._read() finally: self.lock.release() return self.value
def _new_trend(self, name): if not self.__running: raise ENotRunning() """ Return an instance that implements ITrend interface for new trend with no points. """ new_trend = Trend() period = 60 points = [] preferences = {} new_trend.configure({ 'parent': self.trends, 'name': name, 'period': period, 'points': points, 'preferences': preferences }) return new_trend
def get_trends(self): if not self.__running: raise ENotRunning() trend_names = [] for name in self.trends.children_names(): trend_names.append(name) for log_node in self.logger.children_nodes(): trend_name = log_node.name if not trend_name in trend_names: if (self.is_trendable(log_node)): trend_adapter = PeriodicLogTrendAdapter() trend_adapter.configure({ 'parent': self.trends, 'name': trend_name, }) trend_adapter.start() self._persist_trend_configuration(trend_adapter) trend_names.append(trend_name) trend_names.sort() trends = [] for trend_name in trend_names: trends.append(self.trends.get_child(trend_name)) return trends
def get_value_by_name(self, name, skipcache=0): """Get method for RS-5 This method takes a name. Name is case sensitive """ if not self.is_running(): raise ENotRunning() if isinstance(self.value[name], MpxException): if self.debug: msglog.log('omnimeter', msglog.types.INFO, ('Last request had failed. So nothing in cache.' 'Sending packet again %s') % str(self.address)) skipcache = 1 self.lock.acquire() try: if self.is_value_stale() or skipcache: self._read() finally: self.lock.release() if isinstance(self.value[name], MpxException): raise self.value[name] return self.value[name]
def override(self, value, level=16): if not self.is_running(): raise ENotRunning() if isinstance(value, dict): value = OverrideDict(value, self.get_default()) override_list = [] if isinstance(value, OverrideDict): current_ovr = self.get_override() for pa_level in range(1, 16 + 1): ovr = value.get_override(pa_level) if isinstance(ovr, StringType): try: ovr = float(ovr) except: pass if ovr != current_ovr.get_override(pa_level): override_list.append((ovr, pa_level)) else: if isinstance(value, StringType): try: value = float(value) except: pass override_list.append((value, level)) for value, level in override_list: # for historical reasons, override(None, level) has the same behavior # as release(level) if value is None or value == 'None': self.release(level) continue try: self.priority_array.get_child(str(level)).set(value) except: msg = 'Unable to override device %s at level %d' % \ (self.as_node_url(), level) msglog.log('Entity Manager', msglog.types.WARN, msg) msglog.exception()
def override(self, value, level=16): if self.is_remote(): return self.get_subject().override(value, level) if not self.is_running(): raise ENotRunning() return OverrideMixin.override(self, value, level)
def set_default(self, value): if not self.is_running(): raise ENotRunning() self.get_subject().get_child(BAC_RELINQUISH_DFLT).set(value)
def get_write_priority(self): if self.is_remote(): return self.get_subject().get_write_priority(self) if not self.is_running(): raise ENotRunning() return OverrideMixin.get_write_priority(self)
def set_default(self, value): if self.is_remote(): return self.get_subject().set_default(value) if not self.is_running(): raise ENotRunning() return OverrideMixin.set_default(self, value)
def send_request(self, request_obj, response_obj, wait_time=None, numretries=None): """API to devices to send a request object and wait for response devices may provide wait_time, retry_count else may use defaults provided by protocol """ if not self.is_running(): raise ENotRunning() if wait_time is None: wait_time = self.reply_timeout if numretries is None: numretries = self.retry_count #have to lock here to ensure, no one drains the port out if self.debug: msglog.log('omnimeter', msglog.types.INFO, 'wait time and numretries are %s' % str((wait_time, numretries))) save_wait_time = wait_time self.lock.acquire() try: while numretries: try: self.conn.drain() wait_time = save_wait_time t0 = time.time() #loopback object res = self.lh.send_request_with_response(request_obj, request_obj, wait_time) if not res: #should not happen raise EWriteError() wait_time = wait_time - (time.time() - t0) if self.debug: msglog.log('omnimeter', msglog.types.INFO, 'got loopback-resp:time left:%f' % wait_time) if wait_time < 0 : #can never be raise ETimeout() #wait until we get first byte of packet res = 0 while not res: t0 = time.time() res = self.lh.receive_response(self.stx_obj, wait_time) wait_time = wait_time - (time.time() - t0) if wait_time < 0 : raise ETimeout() if self.debug: msglog.log('omnimeter', msglog.types.INFO, 'got first byte. wait time:%f' % wait_time) res = self.lh.receive_response(response_obj, wait_time) if not res: raise EInvalidMessage() return except: numretries -= 1 finally: self.lock.release() if self.debug: msglog.log('omnimeter', msglog.types.INFO, 'Exhausted no. of retries. Raising last exception') raise
def release(self, level): if self.is_remote(): return self.get_subject().release(level) if not self.is_running(): raise ENotRunning() return OverrideMixin.release(self, level)
def _not_running(self, *args, **kw): raise ENotRunning("%r is not running." % self.as_node_url())
def get_override_at(self, level): if self.is_remote(): return self.get_subject().get_override_at(level) if not self.is_running(): raise ENotRunning() return OverrideMixin.get_override_at(self, level)