controls/DebugVariablePanel/DebugVariableItem.py
branchsvghmi
changeset 3257 095c73591b7e
parent 1966 08f70b33bc9f
child 2742 5f7445b582d4
equal deleted inserted replaced
3256:8d1cc99a8f54 3257:095c73591b7e
    24 
    24 
    25 
    25 
    26 from __future__ import absolute_import
    26 from __future__ import absolute_import
    27 from datetime import timedelta
    27 from datetime import timedelta
    28 import binascii
    28 import binascii
    29 import numpy
    29 import numpy as np
    30 from graphics.DebugDataConsumer import DebugDataConsumer, TYPE_TRANSLATOR
    30 from graphics.DebugDataConsumer import DebugDataConsumer, TYPE_TRANSLATOR
       
    31 from controls.DebugVariablePanel.RingBuffer import RingBuffer
    31 
    32 
    32 # -------------------------------------------------------------------------------
    33 # -------------------------------------------------------------------------------
    33 #                 Constant for calculate CRC for string variables
    34 #                 Constant for calculate CRC for string variables
    34 # -------------------------------------------------------------------------------
    35 # -------------------------------------------------------------------------------
    35 
    36 
   140         @param start_tick: Start tick of given range (default None, first data)
   141         @param start_tick: Start tick of given range (default None, first data)
   141         @param end_tick: end tick of given range (default None, last data)
   142         @param end_tick: end tick of given range (default None, last data)
   142         @return: Data as numpy.array([(tick, value, forced),...])
   143         @return: Data as numpy.array([(tick, value, forced),...])
   143         """
   144         """
   144         # Return immediately if data empty or none
   145         # Return immediately if data empty or none
   145         if self.Data is None or len(self.Data) == 0:
   146         if self.Data is None or self.Data.count == 0:
   146             return self.Data
   147             return None
   147 
   148 
   148         # Find nearest data outside given range indexes
   149         # Find nearest data outside given range indexes
   149         start_idx = (self.GetNearestData(start_tick, -1)
   150         start_idx = (self.GetNearestData(start_tick, -1)
   150                      if start_tick is not None
   151                      if start_tick is not None
   151                      else 0)
   152                      else 0)
   152         end_idx = (self.GetNearestData(end_tick, 1)
   153         end_idx = (self.GetNearestData(end_tick, 1)
   153                    if end_tick is not None
   154                    if end_tick is not None
   154                    else len(self.Data))
   155                    else len(self.Data))
   155 
   156 
   156         # Return data between indexes
   157         # Return data between indexes
   157         return self.Data[start_idx:end_idx]
   158         return self.Data.view[start_idx:end_idx]
   158 
   159 
   159     def GetRawValue(self, index):
   160     def GetRawValue(self, index):
   160         """
   161         """
   161         Return raw value at given index for string variables
   162         Return raw value at given index for string variables
   162         @param index: Variable value index
   163         @param index: Variable value index
   193         # Check that data in given range is not empty
   194         # Check that data in given range is not empty
   194         values = data[:, 1]
   195         values = data[:, 1]
   195         if len(values) > 0:
   196         if len(values) > 0:
   196             # Return value range for data in given tick range
   197             # Return value range for data in given tick range
   197             return (data,
   198             return (data,
   198                     data[numpy.argmin(values), 1],
   199                     data[np.argmin(values), 1],
   199                     data[numpy.argmax(values), 1])
   200                     data[np.argmax(values), 1])
   200 
   201 
   201         # Return default values
   202         # Return default values
   202         return data, None, None
   203         return data, None, None
   203 
   204 
   204     def ResetData(self):
   205     def ResetData(self):
   205         """
   206         """
   206         Reset data stored when store data option enabled
   207         Reset data stored when store data option enabled
   207         """
   208         """
   208         if self.StoreData and self.IsNumVariable():
   209         if self.StoreData and self.IsNumVariable():
   209             # Init table storing data
   210             # Init table storing data
   210             self.Data = numpy.array([]).reshape(0, 3)
   211             self.Data = RingBuffer(3)
   211 
   212 
   212             # Init table storing raw data if variable is strin
   213             # Init table storing raw data if variable is strin
   213             self.RawData = ([]
   214             self.RawData = ([]
   214                             if self.VariableType in ["STRING", "WSTRING"]
   215                             if self.VariableType in ["STRING", "WSTRING"]
   215                             else None)
   216                             else None)
   292 
   293 
   293                 data_values.append(
   294                 data_values.append(
   294                     [float(tick), num_value, extra_value])
   295                     [float(tick), num_value, extra_value])
   295 
   296 
   296             # Add New data to stored data table
   297             # Add New data to stored data table
   297             self.Data = numpy.append(self.Data, data_values, axis=0)
   298             self.Data.append(data_values)
   298 
   299 
   299             # Signal to debug variable panel to refresh
   300             # Signal to debug variable panel to refresh
   300             self.Parent.HasNewData = True
   301             self.Parent.HasNewData = True
   301 
   302 
   302     def SetForced(self, forced):
   303     def SetForced(self, forced):
   335         """
   336         """
   336         # If tick given and stored data option enabled
   337         # If tick given and stored data option enabled
   337         if tick is not None and self.Data is not None:
   338         if tick is not None and self.Data is not None:
   338 
   339 
   339             # Return current value and forced flag if data empty
   340             # Return current value and forced flag if data empty
   340             if len(self.Data) == 0:
   341             if self.Data.count == 0:
   341                 return self.Value, self.IsForced()
   342                 return self.Value, self.IsForced()
   342 
   343 
   343             # Get index of nearest data from tick given
   344             # Get index of nearest data from tick given
   344             idx = self.GetNearestData(tick, 0)
   345             idx = self.GetNearestData(tick, 0)
   345 
   346 
   346             # Get value and forced flag at given index
   347             # Get value and forced flag at given index
   347             value, forced = \
   348             value, forced = \
   348                 self.RawData[int(self.Data[idx, 2])] \
   349                 self.RawData[int(self.Data.view[idx, 2])] \
   349                 if self.VariableType in ["STRING", "WSTRING"] \
   350                 if self.VariableType in ["STRING", "WSTRING"] \
   350                 else self.Data[idx, 1:3]
   351                 else self.Data.view[idx, 1:3]
   351 
   352 
   352             if self.VariableType in ["TIME", "TOD", "DT", "DATE"]:
   353             if self.VariableType in ["TIME", "TOD", "DT", "DATE"]:
   353                 value = timedelta(seconds=value)
   354                 value = timedelta(seconds=value)
   354 
   355 
   355             # Get raw value if asked
   356             # Get raw value if asked
   378         # Return immediately if data is empty
   379         # Return immediately if data is empty
   379         if self.Data is None:
   380         if self.Data is None:
   380             return None
   381             return None
   381 
   382 
   382         # Extract data ticks
   383         # Extract data ticks
   383         ticks = self.Data[:, 0]
   384         ticks = self.Data.view[:, 0]
   384 
   385 
   385         # Get nearest data from tick
   386         # Get nearest data from tick
   386         idx = numpy.argmin(abs(ticks - tick))
   387         idx = np.searchsorted(ticks, tick)
   387 
   388 
   388         # Adjust data index according to constraint
   389         # Adjust data index according to constraint
   389         if adjust < 0 and ticks[idx] > tick and idx > 0 or \
   390         if adjust < 0 and ticks[idx] > tick and idx > 0 or \
   390            adjust > 0 and ticks[idx] < tick and idx < len(ticks):
   391            adjust > 0 and ticks[idx] < tick and idx < len(ticks):
   391             idx += adjust
   392             idx += adjust