Пример #1
0
    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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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")
Пример #5
0
    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)
Пример #6
0
 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()
Пример #7
0
 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
Пример #8
0
 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
Пример #9
0
    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
Пример #10
0
 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
Пример #11
0
 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
Пример #12
0
    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]
Пример #13
0
 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()
Пример #14
0
 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)
Пример #15
0
 def set_default(self, value):
     if not self.is_running():
         raise ENotRunning()
     self.get_subject().get_child(BAC_RELINQUISH_DFLT).set(value)
Пример #16
0
 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)
Пример #17
0
 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)
Пример #18
0
    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 
Пример #19
0
 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)
Пример #20
0
 def _not_running(self, *args, **kw):
     raise ENotRunning("%r is not running." % self.as_node_url())
Пример #21
0
 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)